最近,在企业集成方面,做了一些技术尝试,用activemq来集成java与.net系统。
1.首先,搭建主数据管理系统
主界面如下:
3.在spring的配置文件中配置名为testTopic的队列:
<!-- 配置JMS连接工厂 --> <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop"> <property name="connectionFactory"> <bean class="org.apache.activemq.spring.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616"/> </bean> </property> <!-- <property name="maxConncetions" value="1"/>--> </bean> <!-- <bean id ="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616"/> </bean>--> <bean id="SendMessage" class="test.SendMessage"> <property name="jmsTemplate" ref="jmsTemplate"/> <property name="topicName" value="testTopic"/> </bean> <!-- <bean id="Listener" class="test.Listener"> <constructor-arg ref="jmsTemplate"/> <constructor-arg value="testTopic" /> </bean> --> <!-- 配置JMS模版 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="jmsFactory"/> <property name="defaultDestination" ref="testTopic"/> <property name="explicitQosEnabled" value="true"/> <property name="deliveryMode" value="1" /> </bean> <bean id="testTopic" class="org.apache.activemq.command.ActiveMQTopic"> <constructor-arg value="testTopic" /> </bean>
4.发送消息:
package test; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.JMSException; import javax.jms.MapMessage; import javax.jms.Message; import javax.jms.Session; import javax.jms.Topic; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; public class SendMessage { private JmsTemplate jmsTemplate; private String topicName; private Topic testTopic; public void setJmsTemplate(JmsTemplate jmsTemplate){ this.jmsTemplate = jmsTemplate; } public void setTopicName(String topicName) { this.topicName = topicName; } public void sendMessage(final Map message) throws JMSException,InterruptedException{ if(testTopic==null){ System.out.println(jmsTemplate); ConnectionFactory cf =jmsTemplate.getConnectionFactory(); Connection conn = cf.createConnection(); Session sess = conn.createSession(false,Session.AUTO_ACKNOWLEDGE); testTopic = sess.createTopic(topicName); } jmsTemplate.send(testTopic, new MessageCreator(){ @Override public Message createMessage(Session session) throws JMSException { MapMessage mapMess = session.createMapMessage(); Set temp = message.entrySet(); Iterator temp2 = temp.iterator(); while(temp2.hasNext()){ Entry entry = (Entry)temp2.next(); mapMess.setObject((String)entry.getKey(), entry.getValue()); } return mapMess; } }); } /** * 测试 * @param args */ public static void main(String[] args) { } }
5.接收消息:
package test; import javax.jms.JMSException; import javax.jms.MapMessage; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageListener; import javax.jms.Session; import javax.jms.Topic; import org.springframework.jms.JmsException; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.listener.DefaultMessageListenerContainer; public class Listener implements MessageListener{ private JmsTemplate jmsTemplate; private String topicName; public Listener(JmsTemplate jmsTemplate,String topicName){ this.jmsTemplate = jmsTemplate; this.topicName = topicName; Topic topic; try{ topic = this.jmsTemplate.getConnectionFactory().createConnection() .createSession(false, Session.AUTO_ACKNOWLEDGE) .createTopic(topicName); DefaultMessageListenerContainer dc = new DefaultMessageListenerContainer(); dc.setPubSubDomain(true); dc.setDestination(topic); dc.setConnectionFactory(this.jmsTemplate.getConnectionFactory()); dc.setPubSubNoLocal(false); dc.setMessageListener(this); dc.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); dc.initialize(); dc.start(); }catch(JMSException e){ e.printStackTrace(); } } @Override public void onMessage(Message arg0) { // TODO Auto-generated method stub System.out.println("收到的消息:"+arg0); MapMessage map = (MapMessage) arg0; try { System.out.println(map.getObject("Name")); } catch (JMSException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
6.点击消息同步,执行SendMessage:
7.在.net中进行接收监听,点击订阅消息: