Как добавить слушателя очереди во время выполнения в JMS Spring Boot - PullRequest
0 голосов
/ 13 июля 2020

У меня уже есть слушатель, который слушает фиксированную очередь. Я хотел бы изменить его, чтобы добавить слушателя во время выполнения.

Например, производитель читает файлы для 10 пользователей и записывает сообщения в 10 очередей JMS (каждый пользователь имеет свою собственную очередь). Теперь я хочу зарегистрировать новую очередь во время выполнения, чтобы каждая очередь получала свой собственный слушатель.

Есть ли способ добиться этого?

@JmsListener(destination = JmsConfig.INSERT_PRODUCT_QUEUE, containerFactory = "queueFactory")
public void listen(@Payload ProductData[] productDataArray, MessageHeaders headers, Message message) throws JMSException {
    try {
        DefaultImportService defaultImportService = (DefaultImportService) applicationContext.getBean("getDefaultImportService");
        defaultImportService.run(productDataArray, String.valueOf(headers.get("manufacturer")), String.valueOf(headers.get("tenant")));
    } catch (Exception e) {
        log.error("error", e);
    }
}

@Bean
public ActiveMQConnectionFactory connectionFactory() {
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
    connectionFactory.setBrokerURL(brokerUrl);
    connectionFactory.setPassword(user);
    connectionFactory.setUserName(passwort);
    ActiveMQPrefetchPolicy policy = new ActiveMQPrefetchPolicy();
    policy.setQueuePrefetch(10);
    connectionFactory.setPrefetchPolicy(policy);

    return connectionFactory;
}

 @Bean
public JmsListenerContainerFactory<?> queueFactory(DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    configurer.configure(factory, connectionFactory());
    factory.setMessageConverter(messageConverter());
    factory.setSessionTransacted(false);
    factory.setConcurrency("200");
    factory.setPubSubDomain(false);
    return factory;
}
...