ActiveMQ topic 注解监听

▼魔方 西西 提交于 2020-04-09 09:54:46

之前自己在玩activemq的时候了解到mq主要有2种监听方式,一种是队列Queue,另外一种是主题Topic

队列的实现方式比较简单,后面在研究使用注解实现topic监听的时候,,发现mq发送的消息监听类无法接收到,于是百度了一下也没有标准答案,结合了一下源码还有百度,发现需要先配置topic主题jsm监听容器工厂,原因是jms监听默认的是队列Queue形式接收的。以下是xml配置:

    <!-- 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属性,把刚刚配置的监听容器工厂用上,代码如下:

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发送的主题类型消息。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!