以前本身在玩activemq的时候了解到mq主要有2种监听方式,一种是队列Queue,另一种是主题Topicjava
队列的实现方式比较简单,后面在研究使用注解实现topic监听的时候,,发现mq发送的消息监听类没法接收到,因而百度了一下也没有标准答案,结合了一下源码还有百度,发现须要先配置topic主题jsm监听容器工厂,缘由是jms监听默认的是队列Queue形式接收的。如下是xml配置:spring
<!-- Topic主题jsm监听容器工厂 --> <bean id="jmsListenerContainerTopicFactory" class="org.springframework.jms.config.DefaultJmsListenerContainerFactory"> <property name="connectionFactory" ref="jmsConnectionFactoryExtend" /> <!-- pub/sub模型(发布/订阅) --> <property name="pubSubDomain" value="true" /> </bean>
而后在接收类注解使用containerFactory属性,把刚刚配置的监听容器工厂用上,代码以下:session
package com.demo.activemq; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.Session; import org.springframework.jms.annotation.JmsListener; import org.springframework.jms.listener.adapter.MessageListenerAdapter; import org.springframework.jms.support.converter.MessageConversionException; import org.springframework.stereotype.Component; @Component public class TopicReceiver extends MessageListenerAdapter { @Override public void setDefaultResponseTopicName(String destinationName) { super.setDefaultResponseTopicName("MyTopic"); } @JmsListener(destination = "MyTopic", concurrency = "1", containerFactory = "jmsListenerContainerTopicFactory") public void onMessage(Message message, Session session) { try { MessageBean bean = (MessageBean) getMessageConverter().fromMessage(message); // 告知activemq应用已收到消息 message.acknowledge(); System.out.println("topicReceiver1: " + bean.getMessage()); } catch (MessageConversionException e) { e.printStackTrace(); } catch (JMSException e) { e.printStackTrace(); } } }
这样就能顺利接收到mq发送的主题类型消息。ide