springboot整合mq同时监听queue和topic

前言: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

猜你喜欢

转载自blog.csdn.net/weixin_42107940/article/details/83216478