Java中介軟體JMS(三)之ActiveMQ整合spring監聽器(二)
阿新 • • 發佈:2019-01-26
對於讓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(釋出/訂閱)方式執行的結果如上圖所示,說明你成功了.