簡體   English   中英

使用單個Spring Boot應用程序收聽多個IBM MQ

[英]Listen to multiple IBM MQ using single spring boot application

我需要偵聽多個隊列(存在於同一隊列管理器中)。 我有用於偵聽單個隊列的正常工作的Spring Boot應用程序代碼。 但是,有什么方法可以從單個spring boot應用程序連接到多個隊列?

無論如何,是否還可以在運行時將偵聽器從一個隊列切換到另一個隊列?

我有從單個隊列讀取的代碼,如下所示:

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM