如何 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。