gpt4 book ai didi

java - 由于@Poller,Spring Integration @Scheduled 无法工作

转载 作者:行者123 更新时间:2023-12-02 08:52:01 24 4
gpt4 key购买 nike

我正在运行一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com