如何 pause/resume 个人 Spring JMS 消息侦听器
How to pause/resume individual Spring JMS message listeners
我的 Spring Boot JMS 应用程序正在使用来自多个 SQS 队列的消息。每个队列都需要连接到不同的外部资源以处理其消息。如果出现外部资源故障,我预计需要该资源的消费者会迅速将队列耗尽到 DLQ,这可不好玩。
当我的代码检测到它的资源离线时(例如调用 REST 端点的通信异常),我需要能够独立地挂起(暂停)每个消费者的消息侦听器。
我该怎么做?
在搜索对此的平台支持后,我发现 AbstractJmsListeningContainer(通过 Lifecycle 接口)支持 stop() 和 start() 方法,尽管它没有记录是否可以在停止调用后调用启动。
我担心的是我的多个@JmsListener 注释消费者之间似乎有一个共享实例;所以停止一个队列会停止所有队列,我不希望这样。
如何实现暂停个人消费者的最终目标?
我看到过像这样使用多个 bean 定义的引用:
@Bean
SimpleMessageListenerContainer container1(ConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
// snip
}
@Bean
SimpleMessageListenerContainer container2(ConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
// snip
}
...但从未见过任何说明如何以及何时使用其中一个与另一个的解释。
查看我对 的回答。
是的,您可以在 stop()
之后调用 start()
。
注意 stop()
只停止线程;连接保持打开状态。
如果您想关闭所有内容,请在 stop()
之后调用 shutDown()
,然后在 start()
之前调用 initialize()
。
您不应该在侦听器线程上调用 stop()
,但是 - 将它交给另一个线程并等待 isRunning()
为 false。
我的 Spring Boot JMS 应用程序正在使用来自多个 SQS 队列的消息。每个队列都需要连接到不同的外部资源以处理其消息。如果出现外部资源故障,我预计需要该资源的消费者会迅速将队列耗尽到 DLQ,这可不好玩。
当我的代码检测到它的资源离线时(例如调用 REST 端点的通信异常),我需要能够独立地挂起(暂停)每个消费者的消息侦听器。
我该怎么做?
在搜索对此的平台支持后,我发现 AbstractJmsListeningContainer(通过 Lifecycle 接口)支持 stop() 和 start() 方法,尽管它没有记录是否可以在停止调用后调用启动。
我担心的是我的多个@JmsListener 注释消费者之间似乎有一个共享实例;所以停止一个队列会停止所有队列,我不希望这样。
如何实现暂停个人消费者的最终目标?
我看到过像这样使用多个 bean 定义的引用:
@Bean
SimpleMessageListenerContainer container1(ConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
// snip
}
@Bean
SimpleMessageListenerContainer container2(ConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
// snip
}
...但从未见过任何说明如何以及何时使用其中一个与另一个的解释。
查看我对
是的,您可以在 stop()
之后调用 start()
。
注意 stop()
只停止线程;连接保持打开状态。
如果您想关闭所有内容,请在 stop()
之后调用 shutDown()
,然后在 start()
之前调用 initialize()
。
您不应该在侦听器线程上调用 stop()
,但是 - 将它交给另一个线程并等待 isRunning()
为 false。