package org.infosec.ismp.ping; import java.lang.reflect.UndeclaredThrowableException; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashMap; import org.infosec.ismp.daemon.AbstractServiceDaemon; import org.infosec.ismp.util.ThreadCategory; import org.infosec.ismp.util.scheduler.LegacyScheduler; import org.infosec.ismp.util.scheduler.Schedule; import org.infosec.ismp.util.scheduler.Scheduler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import org.springframework.util.Assert; /** * ping服务的管理组件 * * @author lianglin * */ @Component(value="pingd") public class Pingd extends AbstractServiceDaemon { private final static String LOG4J_CATEGORY = "ISMP.Pinger"; private HashMap<String, PingdService> scheduleMap = new HashMap<String, PingdService>(); private Scheduler m_scheduler;// 调度器 private PingdMessageSend pingdsend; private int m_threads = 0; public Pingd() { super(LOG4J_CATEGORY); } @Autowired(required=true) public void setPingdsend( @Qualifier("pingdSend")PingdMessageSend pingdsend) { this.pingdsend = pingdsend; } @Override protected void onInit() { Assert.state(m_threads>0,"请检查,hreads没有赋值"); log().debug("init: init pingd component"); createScheduler(); } /** * 添加一个需要ping的地址 * * @param nodeid * @param ipAddr * @param interval * @param halfIntervalWhenDown */ public void ping(String nodeid, String ipAddr, long interval, boolean halfIntervalWhenDown) { log().debug("nodeid:"+nodeid+"ipAddr:"+ipAddr+"interval:"+interval+"进入Pingd类的ping方法"); InetAddress iaip; try { iaip = InetAddress.getByName(ipAddr); } catch (UnknownHostException e) { log().error("IP地址输入不正确!", e); return; } PingdService pdService = new PingdService(); PingdModel pingdModel = new PingdModel(); pingdModel.setIpAddr(ipAddr); pingdModel.setIpInetAddr(iaip); pingdModel.setNodeid(nodeid); PingdConfig pdConfig = new PingdConfig(); pdConfig.setInterval(interval); if (scheduleMap.containsKey(nodeid)) { // pdService = scheduleMap.get(nodeid); // pdService.delete(); log().error("该nodeid已存在!请重新输入!"); return; } pdService.setPingdmodel(pingdModel); pdService.setPingdsend(pingdsend); pdService.setConfig(pdConfig); pdService.setHalfIntervalWhenDown(halfIntervalWhenDown); Schedule schedule = new Schedule(pdService, pdConfig, m_scheduler); pdService.setSchedule(schedule); pdService.schedule(); scheduleMap.put(nodeid, pdService); } /** * 取消一个曾经添加的ping需求。 * * @param nodeid */ public void unping(String nodeid) { if (scheduleMap.containsKey(nodeid)) { PingdService pdService = scheduleMap.get(nodeid); pdService.delete(); scheduleMap.remove(nodeid); log().debug(" 取消一个曾经添加的ping需求!nodeId:"+nodeid); }else { log().debug("该nodeId:"+nodeid+"不存在服务中!"); } } private void createScheduler() { ThreadCategory log = log(); // Create a scheduler try { log.debug("init: Creating "+LOG4J_CATEGORY+" scheduler"); setScheduler(new LegacyScheduler(LOG4J_CATEGORY, m_threads)); } catch (RuntimeException e) { log.fatal("init: Failed to create "+LOG4J_CATEGORY+" scheduler", e); throw e; } } @Override protected void onStart() { try { if (log().isDebugEnabled()) log().debug("start: Starting snmp collectd scheduler"); getScheduler().start(); } catch (RuntimeException e) { if (log().isEnabledFor(ThreadCategory.Level.FATAL)) log().fatal("start: Failed to start scheduler", e); throw e; } try{ BroadcastEventProcessor processor = new BroadcastEventProcessor(this); }catch (Exception ex) { log().error("Failed to setup event reader", ex); // throw new UndeclaredThrowableException(ex); } } @Override protected void onStop() { if (log().isDebugEnabled()) log().debug("stop: stoping snmp collectd scheduler"); if (getScheduler() != null) { getScheduler().stop(); } } public Scheduler getScheduler() { return m_scheduler; } public void setScheduler(Scheduler scheduler) { m_scheduler = scheduler; } public int getThreads() { return m_threads; } public void setThreads(int threads) { m_threads = threads; } }