我们有一个非常简单的应用程序,其中我们有一个 spring 集成入站jdbc
轮询器,它从 db 表中轮询数据并将这些记录放在直接通道中。从那个通道我们有服务激活器,它获取这些记录并将其放入rabbitmq队列。轮询器被配置为使用用户定义ThreadPoolTaskExecutor
的轮询,最小和最大 1 个线程,这就是我们想要的。
这个应用程序运行良好几天,它以 5 秒的固定延迟进行轮询。还监视这个线程看起来像在 200 毫秒内完成它的工作。
然后突然之间这个轮询线程停止轮询几分钟,这个间隙有时是 1 分钟,有时是 20 分钟。这是不一致的。如果我们重新启动应用程序,那么一旦它重新启动它就会轮询一次,然后它会再次回到不一致的轮询。
我们通过弹簧启动执行器进行了多个线程转储,如果我们分析这些转储,那么我们看不到任何死锁。所有线程转储上显示的所有轮询线程都是WAITING
状态。
我们使用带有 spring 集成的 spring boot 2.2.6,并且应用程序部署在 PCF 中。
自从 Spring Boot 从 2.1.4 升级到 2.2.6 以来,我们已经看到了这种行为,但我不能自信地这么说。
有人可以提供一些可能导致这种奇怪行为的提示吗?