package org.infosec.ismp.agent.eventd; import java.io.StringWriter; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageProducer; import javax.jms.Session; import org.exolab.castor.xml.MarshalException; import org.exolab.castor.xml.ValidationException; import org.infosec.ismp.eventd.EventIpcManagerFactory; import org.infosec.ismp.model.event.Event; import org.infosec.ismp.model.event.EventListener; import org.infosec.ismp.model.event.Events; import org.infosec.ismp.model.event.Log; import org.infosec.ismp.util.ThreadCategory; /** * 将Agent中的事件发送到和Manager通信的Jms服务器 * @author <a href="mailto:lianglin1979@sjtu.edu.cn">lianglin</a> * */ public class JmsEventUploadProcessor implements EventListener { private Session m_session; private Destination m_destination; public JmsEventUploadProcessor(Session session, Destination destination) { this.m_session = session; this.m_destination = destination; addEventListener(); } /** * 在事件中心注册被事件处理器,关注所有事件,即所有事件都将通过Jms传递给Manager. * FIXME:应该将需要上传的事件上传。 */ private void addEventListener() { EventIpcManagerFactory.getIpcManager().addEventListener(this); } @Override public String getName() { return "Eventd:JMSEventUploadProcessor"; } @Override public void onEvent(Event event) { try { log().debug( "starting send event txt message ,destionation is : " + m_destination); StringWriter writer = new StringWriter(); Events events = new Events(); events.addEvent(event); Log log = new Log(); log.setEvents(events); log.marshal(writer); String txt = writer.toString(); MessageProducer producer = m_session.createProducer(m_destination); Message msg = m_session.createTextMessage(txt); producer.send(msg); log().debug( "message sended ,message content is : " + txt + " destination is : " + m_destination); } catch (JMSException e) { log().warn("when send jms message error occur " + e, e); } catch (MarshalException e) { log().warn("could not marshal event " + e, e); } catch (ValidationException e) { log().warn("could not marshal event " + e, e); } } private ThreadCategory log() { return ThreadCategory.getInstance(getClass()); } }