前言:springboot和mq整合的时候,默认情况下,要么只能监听queue要么只能监听topic,而不能二者兼得。
在application.properties文件中通过如下配置项,切换监听消息的类型。
1 2 | #为true时是topic模式,为false是queue模式 spring.jms.pub-sub-domain=true |
如果想同时监听queue和topic怎么办?实现步骤如下:
1:取消mq的默认配置,选择自定义配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | //MQ configuration class @Configuration public class MqConfig { @Bean public Queue queue(){ return new ActiveMQQueue( "mvp.queue" ); } @Bean public Topic topic(){ return new ActiveMQTopic( "mvp.topic" ); } @Bean public ActiveMQConnectionFactory connectionFactory() { return new ActiveMQConnectionFactory( "zhu" , "zhu.123" , "tcp://192.168.25.134:61616" ); } //这个bean的id是jmsListenerContainerTopic @Bean public JmsListenerContainerFactory<?> jmsListenerContainerTopic(ActiveMQConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); bean.setPubSubDomain( true ); bean.setConnectionFactory(connectionFactory); return bean; } //这个bean的id是jmsListenerContainerQueue @Bean public JmsListenerContainerFactory<?> jmsListenerContainerQueue(ActiveMQConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); bean.setConnectionFactory(connectionFactory); return bean; } @Bean public JmsMessagingTemplate jmsMessagingTemplate(ActiveMQConnectionFactory connectionFactory){ return new JmsMessagingTemplate(connectionFactory); } } |
2:发送点对点消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @RestController public class QueueController { @Autowired private Queue queue; @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @RequestMapping("/send") public void send() { jmsMessagingTemplate.convertAndSend(queue, "一杀"); } } |
3:监听点对点消息
1 2 3 4 5 6 7 8 9 | @Component public class QueueConsumer { @JmsListener (destination= "mvp.queue" ,containerFactory= "jmsListenerContainerQueue" ) public void readMessage(String text){ System.out.println( "接收到消息:" +text); } } |
4:发送topic消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | @RestController public class TopicController { @Autowired private Topic topic; @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @RequestMapping ( "/send1" ) public void send() { jmsMessagingTemplate.convertAndSend(topic, "topic-message" ); } } |
5:监听topic消息
1 2 3 4 5 6 7 8 9 | @Component public class TopicConsumer { @JmsListener (destination= "mvp.topic" ,containerFactory= "jmsListenerContainerTopic" ) public void readMessage(String text){ System.out.println( "接收到消息:" +text); } } |
到此:就可以实现在一个springboot工程中既能监听topic也可以监听queue。
完整demo代码:https://pan.baidu.com/s/15pE2fuuYyi5v2FpiiON4OQ