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

问题描述 投票:0回答:1

我的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
}

......但从未见过任何解释,说明如何以及何时使用其他人。

spring-boot spring-jms
1个回答
0
投票

看看我对this question的回答。

是的,你可以在start()之后打电话给stop()

请注意,stop()仅停止线程;连接仍然是开放的。

如果你想关闭所有东西,请在shutDown()之后调用stop(),然后在initialize()之前调用start()

你不应该在一个监听器线程上调用stop() - 把它交给另一个线程并等到isRunning()为假。

© www.soinside.com 2019 - 2024. All rights reserved.