Spring boot Spring集成jdbc轮询器线程挂起或轮询一致

Spring boot Spring集成jdbc轮询器线程挂起或轮询一致,spring-boot,pcf,spring-integration-jdbc,Spring Boot,Pcf,Spring Integration Jdbc,我们有一个非常简单的应用程序,其中有一个spring integration inboundjdbcpoller,它轮询db表中的数据,并将这些记录放在直接通道中。从那个通道我们有服务激活器,它接收这些记录并将其放入rabbitmq队列中。轮询器配置为使用用户定义的ThreadPoolTaskExecutor轮询最小和最大1个线程,这就是我们想要的 该应用程序可以正常运行几天,并以5秒的固定延迟进行轮询。同时,监视此线程看起来像是在200毫秒内完成其工作 然后这个轮询线程突然停止轮询几分钟,这个

我们有一个非常简单的应用程序,其中有一个spring integration inbound
jdbc
poller,它轮询db表中的数据,并将这些记录放在直接通道中。从那个通道我们有服务激活器,它接收这些记录并将其放入rabbitmq队列中。轮询器配置为使用用户定义的
ThreadPoolTaskExecutor
轮询最小和最大1个线程,这就是我们想要的

该应用程序可以正常运行几天,并以5秒的固定延迟进行轮询。同时,监视此线程看起来像是在200毫秒内完成其工作

然后这个轮询线程突然停止轮询几分钟,这个间隔有时是1分钟,有时是20分钟。这是不一致的。如果我们重新启动应用程序,那么一旦它重新启动,它会轮询一次,然后再次返回到不一致轮询

我们通过spring boot actuator进行了多个线程转储,如果我们分析这些转储,那么我们不会看到任何死锁。所有轮询线程都显示在所有线程转储都处于等待状态

我们使用SpringBoot2.2.6和spring集成,应用程序部署在PCF中

自从spring boot从2.1.4升级到2.2.6以来,我们已经看到了这种行为,但我不能自信地说这一点


有人能提供一些提示,说明是什么导致了这种奇怪的行为吗?

这里是根本原因。当您在应用程序中添加@EnableScheduling注释时,Spring boot会添加单线程池。我们还将SpringCloudConfig客户端作为依赖项,因为我们使用vault存储机密,所以必须更新令牌,所以我们将该令牌作为属性提供。这将添加另一个自动配置的bean以续订vault令牌。现在,由于池中只有一个线程,并且我们有网络/vault性能问题,因此该线程一直被卡在续订vault令牌上,几乎无法释放出来进行db轮询。我们还使用了vault的默认更新率,这增加了这个问题。因此,有两件事有助于解决这个问题。我们将vault令牌的ttl增加到24小时,并且我们的系统管理员修复了网络/vault性能问题。

这是根本原因。当您在应用程序中添加@EnableScheduling注释时,Spring boot会添加单线程池。我们还将SpringCloudConfig客户端作为依赖项,因为我们使用vault存储机密,所以必须更新令牌,所以我们将该令牌作为属性提供。这将添加另一个自动配置的bean以续订vault令牌。现在,由于池中只有一个线程,并且我们有网络/vault性能问题,因此该线程一直被卡在续订vault令牌上,几乎无法释放出来进行db轮询。我们还使用了vault的默认更新率,这增加了这个问题。因此,有两件事有助于解决这个问题。我们将保险库令牌的ttl增加到24小时,并且我们的系统管理员修复了网络/保险库性能问题