我有一个正在运行的Spring Boot / Spring Integration应用程序,该应用程序在Spring Integration中使用了@Poller,并且在一个几乎不相关的类中的另一个方法上也使用了@Scheduled@Poller用于轮询FTP服务器以查找新文件。但是我发现@Poller似乎在某种程度上干扰了我的@Scheduled方法。

@Poller具有maxMessagesPerPoll = -1,因此它将处理尽可能多的文件。但是,当我第一次启动应用程序时,FTP服务器上有100多个文件,因此它将全部处理它们。我发现的是,如果正在处理这些文件,则@Scheduler完全停止触发。

例如,如果我将@Scheduled设置为具有fixedDelay = 1来每毫秒触发一次,然后启动我的应用程序,则@Scheduled方法将触发几次,直到@Poller触发并开始处理消息为止。点我的@Scheduled方法完全停止触发。我假设@Poller只是填充了一些任务队列,所以我只需要等待所有消息被处理,即使@Poller完全完成并处理了所有文件之后,@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)。一个常见的错误是拥有许多队列通道(默认情况下,一次保留调度程序线程一秒钟)。

如果您只有一个轮询器,而没有很多队列通道,那么我将无法解释您为什么会出现线程不足。

您可以增加池的大小-请参见Configuring the Task Scheduler

或者,您可以在ScheduledAnnotationBeanPostProcessor中使用其他调度程序。

10-08 10:51