RabbitMQ集群重启时的Spring Integration问题

时间:2016-08-30 07:29:11

标签: spring rabbitmq spring-integration spring-rabbit

我们的系统中有几个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节点回收

请注意,每次受影响的队列可能不同时,此行为不会绑定到特定队列。 另请注意,部署的新配置不会修改任何现有队列(例如,当我们添加新队列时就会发生这种情况)

1 个答案:

答案 0 :(得分:0)

  

侦听器停止使用消息,我们必须重新启动JBoss节点才能恢复。

根据我的经验,这些问题总是因为监听器容器线程被“卡住”在适配器下游的某些代码中。

要进行调试,下次发生时需要进行线程转储(例如使用jstack)并查看消费者线程正在做什么。

听起来这不是你的问题,但我们最近做了fix a bug,这在向现有的侦听器容器添加/删除队列时引起了类似的问题。如果你不这样做,那么这个修复对你没有帮助;你需要查看线程转储,看看发生了什么。