如何暂停/恢复单个Spring JMS消息侦听器

时间:2019-04-24 18:07:25

标签: spring-boot spring-jms

我的Spring Boot JMS应用程序正在使用来自多个SQS队列的消息。每个队列需要连接到不同的外部资源才能处理其消息。如果发生外部资源故障,我希望需要该资源的使用者将迅速将队列消耗到DLQ,这很无聊。

当我的代码检测到其资源处于脱机状态(例如,通信异常调用REST端点)时,我需要能够为每个使用者独立地暂停(暂停)消息监听器。

我该怎么做?

在为此寻求平台支持之后,我发现了AbstractJmsListeningContainer,它(通过Lifecycle接口)支持stop()和start()方法,尽管它没有说明是否可以在stop调用之后调用start。

我担心的是,在多个@JmsListener注释的使用者中似乎有一个共享实例;所以停止一个队列就可以全部停止,而我不想要那样。

如何实现我的最终目标,即暂停个人消费者?

我已经看到了使用多个bean定义的参考,例如:

@Bean
SimpleMessageListenerContainer container1(ConnectionFactory connectionFactory,
        MessageListenerAdapter listenerAdapter) {
// snip
}

@Bean
SimpleMessageListenerContainer container2(ConnectionFactory connectionFactory,
        MessageListenerAdapter listenerAdapter) {
// snip
}

...但从未见过任何解释说明如何以及何时使用一个相对于另一个。

1 个答案:

答案 0 :(得分:0)

请参阅我对this question的回答。

是的,您可以在start()之后致电stop()

请注意,stop()仅停止线程;连接保持打开状态。

如果您想关闭所有内容,请在shutDown()之后致电stop(),然后在initialize()之前致电start()

尽管如此,您不应该在侦听器线程上调用stop()-将其交给另一个线程并等待isRunning()为假。