我的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
}
...但从未见过任何解释说明如何以及何时使用一个相对于另一个。
答案 0 :(得分:0)
请参阅我对this question的回答。
是的,您可以在start()
之后致电stop()
。
请注意,stop()
仅停止线程;连接保持打开状态。
如果您想关闭所有内容,请在shutDown()
之后致电stop()
,然后在initialize()
之前致电start()
。
尽管如此,您不应该在侦听器线程上调用stop()
-将其交给另一个线程并等待isRunning()
为假。