Java 使用单个spring引导应用程序侦听多个IBM MQ

Java 使用单个spring引导应用程序侦听多个IBM MQ,java,spring-boot,ibm-mq,spring-jms,Java,Spring Boot,Ibm Mq,Spring Jms,我需要侦听多个队列(存在于同一队列管理器中)。我有可用的spring引导应用程序代码,用于侦听单个队列。但是,有没有办法从单个spring引导应用程序连接到多个队列 还有,在运行时是否可以将侦听器从一个队列切换到另一个队列 我有从单个队列读取的代码,如下所示: public class ConnectionConfiguration { private static final Logger logger = LogManager.getLogger(ConnectionConfigura

我需要侦听多个队列(存在于同一队列管理器中)。我有可用的spring引导应用程序代码,用于侦听单个队列。但是,有没有办法从单个spring引导应用程序连接到多个队列

还有,在运行时是否可以将侦听器从一个队列切换到另一个队列

我有从单个队列读取的代码,如下所示:

public class ConnectionConfiguration {

  private static final Logger logger = LogManager.getLogger(ConnectionConfiguration.class);

  @Value("${LDR_LOCAL_MQ_READ_FACTORYNAME}")
  String connectionFactory;

  @Value("${LDR_LOCAL_MQ_QUEUENAME}")
  String localQueue;

  @Value("${jmsConcurrency}")
  String concurrency;

  @Value("${servers.mq.host}")
  private String host;

  @Value("${servers.mq.port}")
  private Integer port;

  @Value("${servers.mq.queue-manager}")
  private String queueManager;

  @Value("${servers.mq.channel}")
  private String channel;

  @Value("${servers.mq.queue}")
  private String queue;

  @Value("${servers.mq.timeout}")
  private long timeout;

  @Bean
  public ConnectionFactory connectionFactory() {

    JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
    jndiObjectFactoryBean.setResourceRef(true);
    jndiObjectFactoryBean.setJndiName(connectionFactory);
    try {
      jndiObjectFactoryBean.afterPropertiesSet();
    } catch (IllegalArgumentException e) {
      logger.error(e.getMessage(), e);
      e.printStackTrace();
    } catch (NamingException e) {
      logger.error(e.getMessage(), e);
      e.printStackTrace();
    }
    return (ConnectionFactory) jndiObjectFactoryBean.getObject();
  }

  @Bean
  public MQQueueConnectionFactory mqQueueConnectionFactory() {
    MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
    try {
      mqQueueConnectionFactory.setHostName(host);
      mqQueueConnectionFactory.setQueueManager(queueManager);
      mqQueueConnectionFactory.setPort(port);
      mqQueueConnectionFactory.setChannel(channel);
      mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
      mqQueueConnectionFactory.setCCSID(1208);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return mqQueueConnectionFactory;
  }

  @Bean
  public SimpleMessageListenerContainer queueContainer(MQQueueConnectionFactory mqQueueConnectionFactory) {

    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(mqQueueConnectionFactory);
    container.setDestinationName(queue);
    container.setMessageListener(getListenerWrapper());
    container.start();
    return container;
  }

  @Bean
  public MQListener getListenerWrapper() {
    return new MQListener();
  }

  @Bean
  public JmsTemplate getJmsTemplate() {
    try {
      return new JmsTemplate(mqQueueConnectionFactory());
    } catch (Exception exp) {
      logger.error(exp.getMessage(), exp);
    }
    return null;
  }

}

只需为每个队列添加一个侦听器容器bean


要更改队列,请调用
stop()
,然后调用
shutdown()
,更改目的地,然后调用
initialize()
,然后调用
start()

感谢@Gary的建议,我操纵队列容器,使其不侦听任何特定队列。。创建了一个组件和一个用JmsListener注释的方法。此外,我还使用了stop()、shutdown()、initialize()和start()方法来动态切换队列这是一个很好的示例,说明了如何实现这一点: