最近,在企业集成方面,做了一些技术尝试,用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中进行接收监听,点击订阅消息: