我们的系统中有几个RabbitMQ队列,我们使用Spring Integration amqp:inbound-channel-adapter来使用消息。 Spring应用程序在5个JBoss节点上运行(不在集群中)
RabbitMQ端是一个带有负载均衡器的两个集群节点,具有持久队列,在应用程序端监听器定义非常简单,连接工厂定义如下:
<rabbit:connection-factory id="amqpConnectionFactory" username="${orts.rabbitmq.username}" password="${orts.rabbitmq.password}"
host="${orts.rabbitmq.endpoint}" />
和几个入站通道适配器定义如下:
<amqp:inbound-channel-adapter id="artiqAmqpInboundChannelAdapter"
channel="artiq.queued.action.filter.outbound.channel" error-channel="artiq.recovery.router.channel"
connection-factory="amqpConnectionFactory" header-mapper="amqpHeaderMapper"
queue-names="ortsArtiqQueue" />
由于某些原因(即部署新配置)我们遇到了意外行为,我们必须重新启动RabbitMQ集群,重新启动后发生一个或多个侦听器停止使用消息,我们必须重新启动JBoss节点回收
请注意,每次受影响的队列可能不同时,此行为不会绑定到特定队列。 另请注意,部署的新配置不会修改任何现有队列(例如,当我们添加新队列时就会发生这种情况)
答案 0 :(得分:0)
侦听器停止使用消息,我们必须重新启动JBoss节点才能恢复。
根据我的经验,这些问题总是因为监听器容器线程被“卡住”在适配器下游的某些代码中。
要进行调试,下次发生时需要进行线程转储(例如使用jstack
)并查看消费者线程正在做什么。
听起来这不是你的问题,但我们最近做了fix a bug,这在向现有的侦听器容器添加/删除队列时引起了类似的问题。如果你不这样做,那么这个修复对你没有帮助;你需要查看线程转储,看看发生了什么。