我的Spring Boot JMS应用程序正在使用来自多个SQS队列的消息。每个队列都需要连接到不同的外部资源才能处理其消息。如果外部资源出现故障,我预计需要该资源的消费者会迅速将队列排到DLQ,这并不好玩。
当我的代码检测到其资源处于脱机状态时(例如调用REST端点的通信异常),我需要能够独立地暂停(暂停)每个使用者的消息监听器。
我怎样才能做到这一点?
在搜索了对此的平台支持之后,我发现了AbstractJmsListeningContainer(通过Lifecycle接口)支持stop()和start()方法,尽管它没有记录是否可以在停止调用后调用start。
我担心的是我的多个@JmsListener注释消费者中似乎有一个共享实例;所以停止一个队列会阻止他们所有人,我不希望这样。
如何实现暂停个人消费者的最终目标?
我已经看到了使用多个bean定义的引用,如下所示:
@Bean
SimpleMessageListenerContainer container1(ConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
// snip
}
@Bean
SimpleMessageListenerContainer container2(ConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
// snip
}
......但从未见过任何解释,说明如何以及何时使用其他人。
看看我对this question的回答。
是的,你可以在start()
之后打电话给stop()
。
请注意,stop()
仅停止线程;连接仍然是开放的。
如果你想关闭所有东西,请在shutDown()
之后调用stop()
,然后在initialize()
之前调用start()
。
你不应该在一个监听器线程上调用stop()
- 把它交给另一个线程并等到isRunning()
为假。