我们正在使用一个在Spring Boot 2.0之上构建并使用spring集成框架的高性能Rabbit mq用户。预取计数设置为150,并且并发使用方的数量不为4。一切正常,直到有一天,rmq中仍未收到某些消息。当我们重新启动Java服务时,未确认的消息将得到处理,但问题会在一定时间内再次蔓延。任何人都可以帮助解决这个奇怪的问题。现在,我们已经设置了cron作业,以便在1小时后重新启动服务,以使没有消息被保留。
PS spring boot版本2.0兔子mq版本:3.7.7
编辑
问题已在另一服务中返回。我们已经将Spring Boot服务升级到2.1版本和最新的spring-amqp版本。消息以unacked状态不断增加,服务中没有日志。我正在附上我们服务的threaddump
关于分析某些消息的PS,我认为问题一定程度上在于spring集成渠道。我在我们的服务中启用了调试日志,并发现了引起我注意的特定日志:
2019-12-17 ; 07:33:35.111 ; WARN ; 1 --- [ Thread-3] ; o.s.a.r.l.SimpleMessageListenerContainer ; ; Closing channel for unresponsive consumer: Consumer@7bc9e6ab: tags=[[]], channel=Cached Rabbit Channel: null, conn: Proxy@40620d8e Shared Rabbit Connection: SimpleConnection@4c060c8f [delegate=amqp://[email protected]:5672/, localPort= 45896], acknowledgeMode=AUTO local queue size=0
有人可以对此进行解释吗?>
我们正在使用一个在Spring Boot 2.0之上构建并使用spring集成框架的高性能Rabbit mq用户。预取计数设置为150,并且并发使用方的数量不为4。一切...
通常,有两个可能的原因-侦听器线程被“塞住”用户代码(在大多数情况下,这是问题所在)或Rabbitmq客户端库具有autoRecoveryEnabled=true
;通常,Spring AMQP将其设置为false,但是在某些情况下可以将其设置为true,并且在某些特殊情况下,消费者被“悬挂”。 Spring AMQP不需要它,因为它具有自己的连接恢复机制。