Ручной запуск фабрики контейнеров JMS

У меня есть приложение Spring JMS, настроенное с помощью аннотаций, и я пытаюсь предоставить некоторую информацию приложению ДО запуска слушателей JMS. После этого я хочу вручную запустить слушателей.

Со следующей конфигурацией:

@Bean(name = "queueContainerFactory")
public JmsListenerContainerFactory<?> queue(ConnectionFactory cf) {
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        ActiveMQConnectionFactory amqCf = (ActiveMQConnectionFactory) cf;
        factory.setConnectionFactory(amqCf);
    ...
}

Я увидел вариант: factory.setAutoStartup(FALSE);

При этом контекст приложения запускается, а @JmsListener не запускается, но я не знаю, как запустить фабрику контейнеров JMS вручную.

@JmsListener(containerFactory="queueContainerFactory", destination = "${destination}")
    public void jmsListener(String message) {
...
}

person crm86    schedule 20.09.2016    source источник


Ответы (1)


Вы должны автоматически подключить JmsListenerEndpointRegistry и получить конкретный MessageListenerContainer по его id. Где то id можно настроить на @JmsListener:

/**
 * The unique identifier of the container managing this endpoint.
 * <p>If none is specified, an auto-generated one is provided.
 * @see org.springframework.jms.config.JmsListenerEndpointRegistry#getListenerContainer(String)
 */
String id() default "";

Это может выглядеть так:

@JmsListener(id ="myContainer", 
           containerFactory="queueContainerFactory", 
           destination = "${destination}")
    public void jmsListener(String message) {
...
}

...

@Autowired
JmsListenerEndpointRegistry jmsListenerEndpointRegistry;

...

this.jmsListenerEndpointRegistry.getListenerContainer("myContainer").start();
person Artem Bilan    schedule 20.09.2016
comment
Или вы можете start() реестр, и он запустит все зарегистрированные контейнеры. - person Gary Russell; 20.09.2016