如何在 ConnectionFactory 列表上创建 JMS MessageListenerContainer

How to create JMS MessageListenerContainer on a list of ConnectionFactory

以下配置在 ConnectionFactory.

上创建 MessageListenerContainer
@Configuration
public class MyConfig {
  @Bean
  public MessageListenerContainer myListenerContainer() {
    DefaultMessageListenerContainer messageListenerContainer = new DefaultMessageListenerContainer();
    messageListenerContainer.setConnectionFactory(myConnectionFactory1);
    [...]
    return messageListenerContainer;
  }
}

我想创建与 MessageListenerContainer 相同的配置,但有不同的配置 ConnectionFactory(指向不同的队列管理器)。

我已经尝试 return MessageListenerContainer 的列表(MessageListenerContainer[]List<MessageListenerContainer> 有或没有 @Qualifier)但新消息被忽略.

如何管理 ConnectionFactory 列表中的 MessageListenerContainer 创建?

还有另一种创建多个 MessageListenerContainer 的方法,而不是创建 MessageListenerContainer,而是创建多个 JmsListenerContainerFactory 并在 JmsListener 中设置 bean 名称。

@EnableJms
class JmsConfiguration{

 Bean
 public JmsListenerContainerFactory  jmsListenerContainerFactory(){
     // create jms listener 
 }

 @Bean
 public JmsListenerContainerFactory  jmsListenerContainerFactory2(){
     // create jms listener 
 }

}

这里创建了两个工厂bean,jmsListenerContainerFactoryjmsListenerContainerFactory2,现在您可以在JmsListener中使用这些工厂bean来表示要使用哪个bean。

@Component
class JmsListeners {
  @JmsListener(containerFactory="jmsListenerContainerFactory")
  public void onMessage(...){

  }

  @JmsListener(containerFactory="jmsListenerContainerFactory2")
  public void onMessage2(...){

  }
}

您可以使用应用程序上下文动态注册 bean。

@Component
class Configurer {

    Configurer (GenericApplicationContext context) {
        for (i = 0; ...) {
            ConnectionFactory cf = ...
            context.registerBean("cf" + i, ConnectionFactory.class, () -> cf);
            context.getBean("cf" + i); // to initialize it
            DefaultMessageListenerContainer container = ...
            context.registerBean("container" + i, ...);
            context.getBean("container" + i, ...
        }
    }

}