一直在赶项目,好久没有写博文了,中间偶尔有些代码什么的,也都是放到github了,不过大多都是测试代码,毕竟有些成型的东西是给公司写的,鉴于职业道德,还是不好公开。
言归正传,这两天在接入第三方的收费管理系统,后台有个扫描记录的,数据然后发送到我这里,然后我来处理。
毕竟是走的restful的方式,说到底是比较多的http请求,他们不关心结果,只知道通信成功即可。于是,又用到了消息队列。前面用的是activemq,这里需要再配置一个队列。
如果不整合spring,用原生的activemq代码来写的话,多个队列很容易实现。但是整合spring后,大多都是配置一个队列。琢磨了一下,这里配置了两个队列,其实就是一个配置文件。因为是测试,这样写的有点不雅观。
配置如下:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 消息中介--> <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://127.0.0.1:61616?wireFormat.maxInactivityDuration=0"/> <property name="useAsyncSend" value="true" /> </bean> <!-- 队列目的地--> <bean id="myQueueOne" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg index="0" value="QueueDemoOne"/> </bean> <bean id="myQueueTwo" class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg index="0" value="QueueDemoTwo" /> </bean> <bean id="jmsTemplateOne" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <!-- 设置默认的消息目的地--> <property name="defaultDestination" ref="myQueueOne"/> <property name="deliveryMode" value="1"></property> <!-- 消息不持久化 --> <property name="explicitQosEnabled" value="true"></property> <!-- 由于receiver方法是同步的,所以我们在这里对接收设置超时时间--> <!-- <property name="receiveTimeout" value="60000"/> --> </bean> <bean id="jmsTemplateTwo" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <!-- 设置默认的消息目的地--> <property name="defaultDestination" ref="myQueueTwo"/> <property name="deliveryMode" value="1"></property> <!-- 消息不持久化 --> <property name="explicitQosEnabled" value="true"></property> </bean> <!-- 消息发送者--> <bean id="producer1" class="com.ww.topic.SenderOne"> <property name="jmsTemplate" ref="jmsTemplateOne"/> <!-- 消息目的地,因为jmsTemplate有默认的了,所以这里可以省略 <property name="destination" ref=" myQueue "/>--> </bean> <bean id="producer2" class="com.ww.topic.SenderTwo"> <property name="jmsTemplate" ref="jmsTemplateTwo"/> <!-- 消息目的地,因为jmsTemplate有默认的了,所以这里可以省略 <property name="destination" ref=" myQueue "/>--> </bean> <!-- 消息接收监听器用于异步接收消息--> <bean id="container1" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory"/> <property name="destination" ref="myQueueOne"/> <property name="messageListener" ref="jmsListenerOne"/> </bean> <bean id="container2" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="connectionFactory"/> <property name="destination" ref="myQueueTwo"/> <property name="messageListener" ref="jmsListenerTwo"/> </bean> <!-- 消息监听实现方法一 --> <bean id="jmsListenerOne" class="com.ww.topic.ListenerOne"> </bean> <bean id="jmsListenerTwo" class="com.ww.topic.ListenerTwo"> </bean> </beans>
其实是配置了两个监听器,然后把各自的destination ,sender,listener配置了两个。
测试代码:
sender:
package com.ww.topic; import org.junit.Test; import org.springframework.jms.core.JmsTemplate; import org.springframework.jms.core.MessageCreator; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import javax.jms.TextMessage; /** * Created by wang on 15-3-24. */ public class SenderOne { private JmsTemplate jmsTemplate; public JmsTemplate getJmsTemplate() { return jmsTemplate; } public void setJmsTemplate(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } @Test public void sendQueue(){ jmsTemplate.send(new MessageCreator() { @Override public Message createMessage(Session session) throws JMSException { TextMessage message = session.createTextMessage(); message.setText("This is one sender"); return message; } }); } }
listener:
package com.ww.topic; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; /** * Created by wang on 15-3-24. */ public class ListenerOne implements MessageListener { @Override public void onMessage(Message message) { TextMessage msg = (TextMessage) message; try { System.out.println("REC: "+msg.getText()); } catch (JMSException e) { e.printStackTrace(); } } }
第二个和第一个是同理的代码。
源码下载:https://github.com/ThinkCats/Queue