1. 程式人生 > >springboot整合mq同時監聽queue和topic

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