我正在运行一个 Spring Boot/Spring Integration 应用程序,该应用程序在 Spring Integration 中使用 @Poller
,并在大多数不相关的类中的另一个方法上使用 @Scheduled
。 @Poller
用于轮询 FTP 服务器以查找新文件。但是我发现 @Poller
似乎在某种程度上干扰了我的 @Scheduled
方法。
@Poller 具有 maxMessagesPerPoll = -1
,以便它能够处理尽可能多的文件。然而,当我第一次启动我的应用程序时,FTP 服务器上有超过 100 个文件,因此它将处理所有这些文件。我发现,如果正在处理这些文件,则 @Scheduler
根本停止触发。
例如,如果我将 @Scheduled
设置为 fixedDelay = 1
每毫秒触发一次,然后启动我的应用程序,则 @Scheduled
code> 方法将触发几次,直到 @Poller 触发并开始处理消息,此时我的 @Scheduled 方法完全停止触发。我假设只是有一些任务队列被 @Poller 填充,所以我只需要等待所有消息被处理,但即使在 @Poller 之后code> 已完全完成并已处理所有文件,但 @Scheduled
方法仍然根本没有触发。
我的想法是,也许有一些任务队列正在被 @Poller
填充,这破坏了我的 @Scheduled
方法,但如果是这样,我仍然我没有看到任何方法可以为不同的方法使用单独的任务队列,或者任何其他可能的选项来自定义或修复此问题。
有谁知道我的 @Scheduled
方法可能会发生什么情况,以及如何解决这个问题?
@Poller
:
@Bean
@InboundChannelAdapter(channel = "ftpChannel", poller = @Poller(cron = "0/5 * * ? * *", maxMessagesPerPoll = "-1"))
public MessageSource<InputStream> myMessageSource() {
//Build my message source
return messageSource;
}
@Scheduled
:
@Scheduled(fixedDelay = 6000)
public void myScheduledMethod(){
//Do Stuff
}
最佳答案
他们的调度程序 taskScheduler
使用相同的 bean 名称。
只有当您有 10 个或更多轮询器时才会出现问题(Spring Integration 配置的默认调度程序 bean 默认池大小为 10)。一个常见的错误是拥有许多队列 channel (默认情况下,每次保留调度程序线程一秒钟)。
如果您只有一个轮询器,并且没有很多队列 channel ,我无法解释为什么您会出现线程匮乏的情况。
您可以增加池大小 - 请参阅 Configuring the Task Scheduler .
或者您可以在 ScheduledAnnotationBeanPostProcessor
中使用不同的调度程序。
关于java - 由于@Poller,Spring Integration @Scheduled 无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60713284/