Я использую Spring JMS и хотел бы отключить извлечение сообщений из очереди, в то же время позволяя публиковать новые сообщения в тех же (или других) очередях из этих прослушивателей.
У меня есть метод @JmsListener
, который извлекает сообщения из очереди и обрабатывает их. Этот слушатель на разных этапах будет публиковать sh новых сообщений, используя JmsTemplate.convertAndSend()
@JmsListener(destination = "queue-name")
public void processJob(Object job) {
jmsTemplate.convertAndSend("begin");
// Do some stuff
jmsTemplate.convertAndSend("almost-done");
// More stuff!
jmsTemplate.convertAndSend("done");
}
У меня также есть очень простая фабрика слушателей:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(ActiveMQConnectionFactory myFactory, MessageConverter jacksonJmsMessageConverter) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(myFactory);
factory.setMessageConverter(jacksonJmsMessageConverter);
return factory;
}
Теперь, что я want - остановить слушателя от извлечения сообщений из очереди, в то же время позволяя вызовам convertAndSend
в методе успешно продолжаться.
Единственное, что я видел, чтобы остановить очередь, это вызывать jmsListenerEndpointRegistry.stop();
на бобе JmsListenerEndpointRegistry
. Это остановит очередь должным образом, и никакие сообщения не будут извлечены. Однако, кажется, что остановка JmsListenerEndpointRegistry
также приведет к сообщениям, которые я пытаюсь опубликовать sh с JmsTemplate.convertAndSend
, чтобы не опубликовать sh.
Когда я пытаюсь convertAndSend
сообщение После вызова jmsListenerEndpointRegistry.stop();
я получаю следующую ошибку:
o.a.activemq.ActiveMQSessionExecutor : Received a message on a connection which is not yet started. Have you forgotten to call Connection.start()?
Эта ошибка имеет смысл, я полагаю. Остановка реестра конечных точек не только отключает функциональность для слушателей, но также и функцию публикации сообщений.
Поэтому мой вопрос заключается в следующем: учитывая приведенный выше сценарий со слушателем, как я могу выключить слушатель так, чтобы новые сообщения не обрабатываются, но все еще допускается успешная публикация JmsTemplate.convertAndSend
сообщений?