package org.infosec.ismp.ping; import java.util.Date; import org.infosec.ismp.util.ThreadCategory; import org.infosec.ismp.util.scheduler.ReadyRunnable; import org.infosec.ismp.util.scheduler.Schedule; public class PingdService implements ReadyRunnable { public final static String STATUS_UP = "UP"; public final static String STATUS_DOWN = "DOWN"; private boolean isReady = true; private PingdMessageSend pingdsend; private Schedule schedule; private PingdModel pingdmodel; private PingdConfig config; private boolean halfIntervalWhenDown; public boolean isHalfIntervalWhenDown() { return halfIntervalWhenDown; } public void setHalfIntervalWhenDown(boolean halfIntervalWhenDown) { this.halfIntervalWhenDown = halfIntervalWhenDown; } public PingdConfig getConfig() { return config; } public void setConfig(PingdConfig config) { this.config = config; } private String status ; public PingdMessageSend getPingdsend() { return pingdsend; } public void setPingdsend(PingdMessageSend pingdsend) { this.pingdsend = pingdsend; } public Schedule getSchedule() { return schedule; } public void setSchedule(Schedule schedule) { this.schedule = schedule; } @Override public boolean isReady() { return isReady; } /** * ping主方法 */ private void pingdSend() { log().debug( "进入PingdService类pingdSend()方法!nodeId:" + pingdmodel.getNodeid() + "ipAdderss:" + pingdmodel.getIpAddr()); Long pingtime = null; try { pingtime = Pinger.ping(pingdmodel.getIpInetAddr());// 获取PING通时间 } catch (Exception e) { log().fatal( "PingdService类pingdSend()方法Pinger.ping异常!nodeId:" + pingdmodel.getNodeid() + "ipAdderss:" + pingdmodel.getIpAddr(), e); } if (pingtime == null)// 如果ping不通 { if (STATUS_UP.equalsIgnoreCase(status)) { log().debug( "PingdService类pingdSend()方法该地址现在无法ping通!nodeId:" + pingdmodel.getNodeid() + "ipAdderss:" + pingdmodel.getIpAddr()); if (halfIntervalWhenDown) // 如果为TRUE 发送时间减半 { config.setInterval(config.getInterval() / 2); } } status = STATUS_DOWN; pingdmodel.setPingFlag(status);// 如果不通设置ping状态为1 } else// 如果ping通 { if (STATUS_DOWN.equalsIgnoreCase(status)) { log().debug( "PingdService类pingdSend()方法该地址现在又可以ping通!nodeId:" + pingdmodel.getNodeid() + "ipAdderss:" + pingdmodel.getIpAddr() + "pingtime:" + pingtime); if (halfIntervalWhenDown) // 如果为TRUE 发送时间回复 { config.setInterval(config.getInterval() * 2); } } status = STATUS_UP; pingdmodel.setPingFlag(status);// 如果不通设置ping状态为0 } pingdmodel.setResponseTime(pingtime); try { pingdsend.springSend(pingdmodel); log().debug( "nodeId:" + pingdmodel.getNodeid() + "ipAdderss:" + pingdmodel.getIpAddr() + "发功MQ队列消息成功!"); } catch (Exception e) { log().fatal( "PingdService类pingdSend()方法发送MQ信息失败!nodeId:" + pingdmodel.getNodeid() + "ipAdderss:" + pingdmodel.getIpAddr(), e); } } public PingdModel getPingdmodel() { return pingdmodel; } public void setPingdmodel(PingdModel pingdmodel) { this.pingdmodel = pingdmodel; } @Override public void run() { pingdSend(); log().debug( "pingd消息发送MQ完毕!nodeId:" + pingdmodel.getNodeid() + "ipAdderss:" + pingdmodel.getIpAddr()); } /** * 将该服务放入调度池中 */ public void schedule() { if (schedule == null) throw new IllegalStateException( "Cannot schedule a service whose schedule is set to null"); schedule.schedule(); log().debug( "该服务放入调度池中!nodeId:" + pingdmodel.getNodeid() + "ipAdderss:" + pingdmodel.getIpAddr()); } /** * 取消该服务 */ public void delete() { if (schedule == null) throw new IllegalStateException( "Cannot unschedule a service whose schedule is set to null"); schedule.unschedule(); log().debug( "取消该服务!nodeId:" + pingdmodel.getNodeid() + "ipAdderss:" + pingdmodel.getIpAddr()); } private ThreadCategory log() { return ThreadCategory.getInstance(getClass()); } }