原文鏈接:http://blog.csdn.net/dwc_fly/article/details/10834005
對於讓spring管理監聽的實現方式有兩種方法,一種是自己寫監聽器,然後交給spring的監聽適配器管理,再由監聽容器管理監聽適配器,另一種是寫一個實現MessageListener接口的類。第一種在第一章涉及到,但是沒有交給spring託管.其實實現的方法很簡單,在j2ee mvc模式中,用到spring的aop特性.這章講第
二種方法,這樣消費者可以時時接受到生產者的消息,訂閱者可以時時接受到發佈者的消息.不用循環接受。
1.Queue(點對點)方式
消費者QueueConsumerMessageListener類,具體如下:
- package jms.mq.spring;
- import javax.jms.JMSException;
- import javax.jms.Message;
- import javax.jms.MessageListener;
- import javax.jms.TextMessage;
- public class QueueConsumerMessageListener implements MessageListener{
- public void onMessage(Message msg) {
- if(msg instanceof TextMessage){
- TextMessage textMessage = (TextMessage) msg;
- try {
- System.out.println("--隊列 MessageListener收到信息:"+textMessage.getText());
- } catch (JMSException e) {
- e.printStackTrace();
- }
- }
- }
- }
2.Topic(發佈/訂閱)方式
訂閱者實現類TopicSubscriberMessageListener類,具體如下:
- package jms.mq.spring;
- import javax.jms.JMSException;
- import javax.jms.Message;
- import javax.jms.MessageListener;
- import javax.jms.TextMessage;
- public class TopicSubscriberMessageListener implements MessageListener{
- public void onMessage(Message msg) {
- if(msg instanceof TextMessage){
- TextMessage textMessage = (TextMessage) msg;
- try {
- System.out.println("--訂閱者 MessageListener收到信息:"+textMessage.getText());
- } catch (JMSException e) {
- e.printStackTrace();
- }
- }
- }
- }
3.修改配置文件
- <!-- 實現接口的方式 -->
- <bean id="queueConsumerMessageListener" class="jms.mq.spring.QueueConsumerMessageListener">
- </bean>
- <!-- 新增一個隊列地址名字不能跟上面的重複 -->
- <bean id="queueConsumerMessageListenerDest" class="org.apache.activemq.command.ActiveMQQueue">
- <constructor-arg index="0" value="myMessageListenerQueue" />
- </bean>
- <bean id="myMsgQueuelistenerContainer"
- class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <property name="connectionFactory" ref="connectionFactory" />
- <property name="destination" ref="queueConsumerMessageListenerDest" />
- <property name="messageListener" ref="queueConsumerMessageListener" />
- <property name="receiveTimeout" value="10000" />
- </bean>
- <bean id="topicSubscriberMessageListener" class="jms.mq.spring.TopicSubscriberMessageListener"></bean>
- <bean id="topicSubscriberMessageListenerDest" class="org.apache.activemq.command.ActiveMQTopic">
- <constructor-arg index="0" value="myMessageListenerTopic" />
- </bean>
- <bean id="myMsgTopiclistenerContainer"
- class="org.springframework.jms.listener.DefaultMessageListenerContainer">
- <property name="connectionFactory" ref="connectionFactory" />
- <property name="destination" ref="topicSubscriberMessageListenerDest" />
- <property name="messageListener" ref="topicSubscriberMessageListener" />
- <property name="pubSubDomain" value="true" />
- <property name="receiveTimeout" value="10000" />
- </bean>
順便將上一章的配置也改一下
- <bean id="queueProducerService" class="jms.mq.spring.QueueProducerService">
- <property name="jmsTemplate" ref="jmsQueueTemplate" />
- <!--<property name="destination" ref="queueDest" /> -->
- <property name="destination" ref="queueConsumerMessageListenerDest" />
- </bean>
- <bean id="queueConsumerService" class="jms.mq.spring.QueueConsumerService">
- <property name="jmsTemplate" ref="jmsQueueTemplate" />
- <property name="destination" ref="queueDest" />
- </bean>
- <bean id="topicPublisherService" class="jms.mq.spring.TopicPublisherService">
- <property name="jmsTemplate" ref="jmsTopicTemplate" />
- <!-- <property name="destination" ref="topicDest" /> -->
- <property name="destination" ref="topicSubscriberMessageListenerDest" />
- </bean>
- <bean id="topicSubscriberService" class="jms.mq.spring.TopicSubscriberService">
- <property name="jmsTemplate" ref="jmsTopicTemplate" />
- <property name="destination" ref="topicDest" />
- </bean>
注意是修改 bean id爲queueProducerService和的topicPublisherService的destination
4.運行
Queue(點對點)方式,只運行QueueProducerTest.java,結果如下
Topic(發佈/訂閱)方式,只運行TopicPublisherTest.java,結果如下
ok,如果Queue(點對點)方式和Topic(發佈/訂閱)方式運行的結果如上圖所示,說明你成功了.