【发布时间】:2023-03-18 22:05:01
【问题描述】:
我的 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
}
...但从未见过任何解释说明如何以及何时使用一个与另一个。
【问题讨论】: