如何配置和启用 JMS 侦听器以根据某些条件使用消息?

How to configure and enable a JMS Listener to consume messages based on some condition?

我的应用程序中有两个侦听器(fooMessagesbarMessages),它们都连接到同一个队列。在某个时间点,只有一个侦听器会根据某种条件使用队列中的消息。在 application.yml 文件中,如果 fooEnabled 设置为 true,则 fooMessages 侦听器应使用消息,如果 fooEnabled 设置为 false,则 barMessages 监听器应该消费消息。

听众:

@JMSListener(destination="${queueName}", selector = "${selectorName}")
public void fooMessages(Message message) {
   // foo logic
}
    
@JMSListener(destination="${queueName}", selector = "${selectorName}")
public void barMessages(Message message) {
   // bar logic
}

application.yml 文件:

queueName: myqueue
selectorName: "priority=medium"
fooEnable: true

如何配置侦听器来处理这种情况?

  1. 给每个听众一个id
  2. 将容器工厂配置为不自动启动侦听器https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties.integration.spring.jms.listener.auto-startup
  3. 使用 JmsListenerEndpointRegistry bean 手动启动容器 - registry.getListenerContainer("fooListener").start();
@Bean
ApplicationRunner runner(@Value("${fooEnabled}") boolean fooEnabled, 
        @Value("${barEnabled}") boolean barEnabled, JmsListenerEndpointRegistry registry) {
    return args -> {
        if (fooEnabled) ...
    }
}