package org.infosec.ismp.agent.register; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import java.util.UUID; import org.infosec.ismp.daemon.AbstractServiceDaemon; import org.infosec.ismp.eventd.EventIpcManagerFactory; import org.infosec.ismp.eventd.sender.EventSender; import org.infosec.ismp.eventd.sender.SingleEventResponseCallback; import org.infosec.ismp.model.event.Event; import org.infosec.ismp.model.event.EventConstants; import org.springframework.util.Assert; /** * 维持和Manager之间的注册通信,Manager在一定时间(3×interval)内收不到信息,认为该 * Agent失去联系。 * @author <a href="mailto:lianglin1979@sjtu.edu.cn">lianglin</a> * */ public class AgentRegister extends AbstractServiceDaemon { private Timer m_timer; // private String m_agentName; private String m_managerIp; private int m_port=-1; private InetAddress m_managerAddress; private String agentId; private String uuid; private int agentPort; private String agentAddress; public AgentRegister() { super("ISMP.AgentRegister"); uuid = UUID.randomUUID().toString(); } @Override protected void onInit() { Assert.state(agentId != null, "must set agentId property"); Assert.state(agentAddress!=null,"must set agentAddress property"); Assert.state(agentPort!=0,"must set agentPort property"); Assert.state(m_managerIp!=null,"must set managerIp property"); Assert.state(m_port!=-1,"must set port property"); try { m_managerAddress = InetAddress.getByName(m_managerIp); } catch (UnknownHostException e) { throw new RuntimeException("managerIp format is error : "+m_managerIp); } } private void doRegister() { log().debug("start register "); Event event = createRegisterEvent(); SingleEventResponseCallback cb = new SingleEventResponseCallback(m_managerAddress, m_port); try { EventSender.sendEvent(m_managerAddress, m_port, event, 1000*30, cb); cb.waitFor(); } catch (Exception e) { log().warn("register error : "+e); } String uuid = event.getUuid(); if(uuid.equals(cb.getUuid())){ System.out.println("register success"); // Event registerEvent = createRegisterSucessEvent(); // EventIpcManagerFactory.getIpcManager().sendNow(registerEvent); }else{ System.out.println("register fail"); // Event registerEvent = createRegisterFailureEvent(); // EventIpcManagerFactory.getIpcManager().sendNow(registerEvent); } } // private Event createRegisterFailureEvent(){ // Event event = new Event(); // event.setUuid(UUID.randomUUID().toString()); // event.setTime(EventConstants.formatToString(new Date())); //// event.setCreationTime(EventConstants.formatToString(new Date())); //// event.setFromAgent(true); // event.setUei(EventConstants.AGENT_REGIESTER_EVENT_UEI); // event.setSource("ISMP.AgentRegister"); // // return event; // } // // private Event createRegisterSucessEvent(){ // Event event = new Event(); // event.setUuid(UUID.randomUUID().toString()); // event.setTime(EventConstants.formatToString(new Date())); //// event.setCreationTime(EventConstants.formatToString(new Date())); //// event.setFromAgent(true); // event.setUei(EventConstants.AGENT_REGIESTER_SUCCESS_UEI); // event.setSource("ISMP.AgentRegister"); // return event; // } private Event createRegisterEvent() { Event event = new Event(); event.setUuid(UUID.randomUUID().toString()); event.setNodeid(agentId); event.setUei(EventConstants.AGENT_REGIESTER_EVENT_UEI); event.setSource("ISMP.AgentRegister"); event.addParam("port", Integer.toString(agentPort)); event.addParam("uuid",uuid); event.setIpAddr(agentAddress); // event.setTime(time) return event; } @Override protected void onStart() { startTimer(); } private void startTimer() { if (m_timer != null) { log().debug( "startTimer() called,but previous timer exists;making sure it's cleaned up "); m_timer.cancel(); } log().debug("scheduling new register timer"); m_timer = new Timer("ISMP.AgentRegister", false); TimerTask task = new TimerTask() { @Override public void run() { doRegister(); } }; //FIXME: 移到配置文件中 m_timer.scheduleAtFixedRate(task, 10, 100 * 1000); } @Override protected void onStop() { stopTimer(); } private void stopTimer() { if (m_timer != null) { log().debug("Stoping existing timer"); m_timer.cancel(); m_timer = null; } else { log().debug("stopTimer() called,but there is no existing timer"); } } public void setAgentPort(int agentPort) { this.agentPort = agentPort; } public void setAgentAddress(String agentAddress) { this.agentAddress = agentAddress; } public void setManagerIp(String managerIp) { m_managerIp = managerIp; } public void setPort(int port) { m_port = port; } public void setAgentId(String agentId) { this.agentId = agentId; } public String getUuid() { return uuid; } public void setUuid(String uuid) { this.uuid = uuid; } public static void main(String[] args) throws Exception{ AgentRegister register = new AgentRegister(); register.setPort(5817); // register.setAgentName("testAgent"); register.setManagerIp("127.0.0.1"); register.setAgentAddress("192.168.9.169"); register.setAgentPort(5819); register.afterPropertiesSet(); register.start(); } }