diff --git a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientInstance.java b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientInstance.java index 85aac75..578affd 100644 --- a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientInstance.java +++ b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientInstance.java @@ -5,9 +5,10 @@ import com.taover.util.UtilLog; public class ClientInstance implements Instance{ private AnalysisHeartbeatInstanceEntity instance; - private ClientRequest lastestClientRequest; - private long lastestServerUnixtime = System.currentTimeMillis()/1000; + private ClientRequest latestClientRequest; private long currFlushServerUnixtimeBaseline = 0L; + private long latestClientServerUnixtime = System.currentTimeMillis()/1000; + private long latestDetectServerUnixtime = this.latestClientServerUnixtime; private int lostClientRequestCount = 0; private boolean detectNewLost = false; @@ -18,45 +19,51 @@ public class ClientInstance implements Instance{ @Override public void flush() { //还未收到请求,则无需刷新失败次数 - if(lastestClientRequest == null) { + if(latestClientRequest == null) { return; } - this.detectNewLost = false; - this.currFlushServerUnixtimeBaseline = System.currentTimeMillis()/1000; - //通过服务器时间,判断是否超时未收到客户端请求 - if(isNewLoopForFixRateSec()) { - ++this.lostClientRequestCount; - this.detectNewLost = true; - - UtilLog.infoForMessage("检测到超时未收到请求,code["+this.getIdentity()+"],丢包统计["+this.lostClientRequestCount+"]", ServerInstance.class); + synchronized (this) { + this.detectNewLost = false; + this.currFlushServerUnixtimeBaseline = System.currentTimeMillis()/1000; + //通过服务器时间,判断是否超时未收到客户端请求 + if(isNewLoopForFixRateSec()) { + this.latestDetectServerUnixtime = this.currFlushServerUnixtimeBaseline; + if(isOverdueFixAndMaxWaitTime()) { + ++this.lostClientRequestCount; + this.detectNewLost = true; + UtilLog.infoForMessage("检测到超时未收到请求,code["+this.getIdentity()+"],丢包统计["+this.lostClientRequestCount+"]", ServerInstance.class); + } + } } } + private boolean isOverdueFixAndMaxWaitTime() { + //System.out.println("isOverdueFixAndMaxWaitTime:"+(this.currFlushServerUnixtimeBaseline-this.latestClientServerUnixtime)+" > "+(this.instance.getFixRateSec()+this.instance.getMaxWaitSec())); + return (this.currFlushServerUnixtimeBaseline-this.latestClientServerUnixtime) > (this.instance.getFixRateSec()+this.instance.getMaxWaitSec()); + } + private boolean isNewLoopForFixRateSec() { - return ((this.currFlushServerUnixtimeBaseline-this.lastestServerUnixtime) / this.instance.getFixRateSec()) > this.lostClientRequestCount; + //System.out.println("isNewLoopForFixRateSec:"+(this.currFlushServerUnixtimeBaseline-this.latestDetectServerUnixtime)+" > "+this.instance.getFixRateSec()); + return ((this.currFlushServerUnixtimeBaseline-this.latestDetectServerUnixtime) / this.instance.getFixRateSec()) > 0; } @Override - public boolean needReform() { + public boolean needReform() { return this.detectNewLost && this.lostClientRequestCount>=1 && this.lostClientRequestCount<=this.instance.getReformMaxTime(); } @Override - public boolean needDeploy() { + public boolean needDeploy() { return this.detectNewLost && this.lostClientRequestCount == this.instance.getDeployAtLostNum(); } - public long getLastestServerUnixtime() { - return lastestServerUnixtime; - } - public int getLostClientRequestCount() { return lostClientRequestCount; } public ClientRequest getLastestClientRequest() { - return lastestClientRequest; + return latestClientRequest; } public AnalysisHeartbeatInstanceEntity getInstance() { @@ -64,15 +71,20 @@ public class ClientInstance implements Instance{ } public void dealClientRequest(ClientRequest clientRequest) { + //System.out.println("dealClientRequest:"+clientRequest.toString()); + if(this.instance.getFixRateSec() == null) { this.instance.setFixRateSec(Instance.DEFAULT_FIX_RATE_SEC); } if(this.instance.getMaxWaitSec() == null) { this.instance.setMaxWaitSec(Instance.DEFAULT_MAX_WAIT_SEC); } - this.lastestClientRequest = clientRequest; - this.lastestServerUnixtime = System.currentTimeMillis()/1000; - this.lostClientRequestCount = 0; + + synchronized (this) { + this.latestClientRequest = clientRequest; + this.latestClientServerUnixtime = System.currentTimeMillis()/1000; + this.lostClientRequestCount = 0; + } } @Override @@ -80,11 +92,15 @@ public class ClientInstance implements Instance{ return this.instance.getCode(); } + public long getLatestClientServerUnixtime() { + return this.latestClientServerUnixtime; + } + public long getUnixtime() { - if(this.lastestClientRequest == null) { - return this.lastestServerUnixtime; + if(this.latestClientRequest == null) { + return this.latestClientServerUnixtime; }else { - return this.lastestClientRequest.getUnixtime(); + return this.latestClientRequest.getUnixtime(); } } } diff --git a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientRequest.java b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientRequest.java index 748c27f..7d3b3a6 100644 --- a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientRequest.java +++ b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ClientRequest.java @@ -60,4 +60,9 @@ public class ClientRequest { public String getIdentity() { return this.code; } + + @Override + public String toString() { + return "ClientRequest [code=" + code + ", ip=" + ip + ", unixtime=" + unixtime + ", seckey=" + seckey + "]"; + } } diff --git a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ServerInstance.java b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ServerInstance.java index 6f88952..6340cf4 100644 --- a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ServerInstance.java +++ b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/bean/ServerInstance.java @@ -39,8 +39,9 @@ public class ServerInstance implements Instance { return; } - this.latestRequestUnixtime = this.serverUnixtimeBaseline; + //发送数据包,并更新结构数据 try { + this.latestRequestUnixtime = this.serverUnixtimeBaseline; this.isSendNewHeartbeat = true; this.latestUrlWithParam = this.instance.getUrl() + this.getUrlParams(); UtilLog.infoForMessage("向code["+this.getIdentity()+"],url["+this.latestUrlWithParam+"]发送心跳请求", ServerInstance.class); @@ -52,7 +53,7 @@ public class ServerInstance implements Instance { } catch(SocketTimeoutException timeError) { this.latestServerResponse = ServerResponse.createOverdue(); } catch (Exception e) { - this.latestServerResponse = ServerResponse.createException(e); + this.latestServerResponse = ServerResponse.createException(e); } //判断响应是否正常 @@ -69,7 +70,8 @@ public class ServerInstance implements Instance { } private boolean isNewLoopForFixRateSec() { - return ((this.serverUnixtimeBaseline-this.latestRequestUnixtime)/this.instance.getFixRateSec()) > this.errorServerResponseCount; + System.out.println("isNewLoopForFixRateSec:"+(this.serverUnixtimeBaseline-this.latestRequestUnixtime)+" > "+this.instance.getFixRateSec()); + return (this.serverUnixtimeBaseline-this.latestRequestUnixtime) > this.instance.getFixRateSec(); } public AnalysisHeartbeatInstanceEntity getInstance() { diff --git a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/service/HeartbeatReformServiceImpl.java b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/service/HeartbeatReformServiceImpl.java index 0c99485..8112f1d 100644 --- a/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/service/HeartbeatReformServiceImpl.java +++ b/src/main/java/com/taover/bazhuayun/analysis/web/module/heartbeat/service/HeartbeatReformServiceImpl.java @@ -60,11 +60,11 @@ public class HeartbeatReformServiceImpl implements HeartbeatReformService { htmlContent += " 未收到服务器响应\n"; }else { if(instance.getLatestServerResponse().isOverdue()) { - htmlContent += " 向接口["+entity.getUrl()+"]发送请求,响应超时["+entity.getMaxWaitSec()+"s],请及时确认服务是否正常运行\n"; + htmlContent += " CODE["+instance.getIdentity()+"]监控异常,向接口["+entity.getUrl()+"]发送请求,响应超时["+entity.getMaxWaitSec()+"s],请及时确认服务是否正常运行\n"; }else if(!instance.getLatestServerResponse().isCodeOk()) { - htmlContent += " 向接口["+entity.getUrl()+"]发送请求,响应数据不正常(详细请查看邮件),请及时确认服务是否正常运行\n"; + htmlContent += " CODE["+instance.getIdentity()+"]监控异常,向接口["+entity.getUrl()+"]发送请求,响应数据不正常(详细请查看邮件),请及时确认服务是否正常运行\n"; }else { - htmlContent += " 向接口["+entity.getUrl()+"]发送请求,未知异常,请及时确认服务是否正常运行\n"; + htmlContent += " CODE["+instance.getIdentity()+"]监控异常, 向接口["+entity.getUrl()+"]发送请求,未知异常,请及时确认服务是否正常运行\n"; } } htmlContent += " 最后一次请求时间: "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(instance.getLatestRequestUnixtime()*1000)); @@ -148,7 +148,7 @@ public class HeartbeatReformServiceImpl implements HeartbeatReformService { htmlContent += "