java - Spring Boot 2.0服务: messages delivered from Rabbit mq but not reaching java code

标签 java spring spring-boot rabbitmq spring-integration

我们正在使用基于 Spring Boot 2.0 构建的高性能 Rabbit mq 消费者,并使用 Spring 集成框架。预取计数设置为 150,并发消费者数量为 4 。一切都工作正常,直到有一天 rmq 中的一些消息仍未得到确认。当我们重新启动 java 服务时,未确认的消息会得到处理,但问题会在一定时间内再次出现。任何人都可以帮助解决这个奇怪的问题吗?现在我们已经设置了一个 cron 作业,在 1 小时后重新启动服务,这样就不会出现未确认的消息。

PS Spring Boot 2.0版本 兔子MQ版本:3.7.7

编辑

该问题在另一个服务中又出现了。我们已将 Spring Boot 服务升级到 2.1 版本和最新的 spring-amqp 版本。处于未确认状态的消息不断增加,服务中没有任何日志。我正在附加我们服务的线程转储

线程转储:https://fastthread.io/my-thread-report.jsp?p=c2hhcmVkLzIwMTkvMTIvMTcvLS1hcGktZjA3MmQ1NDUtZDRlYy00ZGQxLThkZjktN2M2YzAyYjM0ZTMxZTUwZWUyYTktM2EyMC00ZDhkLThlZjctM2NmZjVlZmVlNTdkLnR4dC0t&

PS在分析一些消息时我认为问题出在Spring集成 channel 上。我在我们的服务中启用了调试日志,并发现了一个引起我注意的特定日志:

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://kaarmaapp@10.0.12.209:5672/, localPort= 45896], acknowledgeMode=AUTO local queue size=0

有人可以解释一下吗

最佳答案

一般来说,有两个可能的原因 - 监听器线程“卡在”用户代码中(这在大多数情况下都是问题)或者rabbitmq客户端库有autoRecoveryEnabled=true;一般来说,Spring AMQP 将其设置为 false,但在某些情况下可以将其设置为 true,并且在某些特殊情况下,消费者会“悬而未决”。 Spring AMQP不需要它,因为它有自己的连接恢复机制。

对于第一种情况,进行线程转储以查看线程正在做什么。

对于第二种情况,升级到最新的 spring amqp (2.0.8 - boot 2.0.6) 或 2.1.0 (这将是 boot 2.1 中的版本)。

关于java - Spring Boot 2.0服务: messages delivered from Rabbit mq but not reaching java code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53007626/

相关文章:

java.lang.ClassNotFoundException : org. springframework.web.context.ContextLoaderListener 问题

spring - 在 spring 上下文初始化之前运行代码

spring - 不同应用服务器上的DAO

Spring Security 自定义过滤器创建无限循环

java - 找不到符号 - Spring Boot Maven 同级作为依赖项

java - 无法确定缺少类型的已实现接口(interface)

java - 从java中文件的某个随机行扫描?

java - 如何克隆TestNG的TestResult

java - Spring Boot 2.1 在 Debug模式下启动根记录器,直到横幅打印出来?

java - 你如何在java中为游戏加倍缓冲?