混合 spring-集成和 spring 调度程序

Mix spring-integration and spring scheduler

我们正在混合 spring-集成 和来自 spring-boot 的 调度功能,使用:

@SpringBootApplication
@EnableIntegration
@IntegrationComponentScan
@EnableConfigurationProperties
@EnableScheduling
public class MyApplication {
...
}

@EnableScheduling 创建一个名为“taskScheduler”的 bean,然后由 spring-integration:

使用
public abstract class IntegrationContextUtils {
  public static final String TASK_SCHEDULER_BEAN_NAME = "taskScheduler";
  ...
}
private void registerTaskScheduler() {
  if (!this.beanFactory.containsBean(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME)) {
    ...
    this.registry.registerBeanDefinition(IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME, scheduler);
  }
}

问题是,spring-integration 的默认 poolSize 是 10(当我们遇到饥饿时需要这个值),而 spring-boot 的默认 poolSize 是 1(我们也需要避免在我们计划的进程中并发。

问题:

  • 这是 spring 集成与 spring- 启动调度功能共享其任务调度程序 bean 的正常行为吗?
  • 有没有办法为 spring 集成指定唯一的任务调度程序,无论启动时调度是否启用?

感谢您的回答

行为和逻辑是正确的。从 Spring 启动角度来看配置约定的期望也是正确的。只有你想念的是 @EnableScheduling 不是 Spring 引导功能,而是 Spring 原生框架:https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#scheduling。 Spring Boot jsut给了我们额外的自由配置一些关于此事的bean。所以,我们只需要依赖它的自动配置。

如果自动配置不符合您的要求,您始终可以提供自己的配置并在需要时覆盖。

查看 @EnableScheduling、它的 @Scheduled 钩子和 Spring 引导中的适当 TaskSchedulingAutoConfiguration,覆盖任何你想做的东西都不是那么容易 Spring 整合快乐的同时。所以,我们应该走相反的方向,真正为 Spring 集成端点覆盖 Scheduler。每个使用 poller 的地方,您还需要配置自定义 Scheduler 而不是自动配置。