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

标签 java spring spring-integration

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

相关文章:

java - 如何在 spring boot 中从 application.properties 文件创建可配置的 Retryable maxAttempts 和 backoff

java - 使用 Citrus 框架和 Spring Integration 从 tcp 服务器接收消息超时

java - Spring-Integration XML 到 Java

Java Logger 不记录到控制台

spring - 使用 Spring Boot + IntelliJ 进行开发的最佳方式

java - gRPC 单元测试的最佳实践

java - 存储库查询和实体实例变量名称

java - Spring 集成 : Calling event once certain sets of events have performed their task successfully.

java - 使用 gradle 运行特定的 junit4 类别

java - 使用抽象/父类(super class)进行类的内部工作。访问修饰符的良好实践