首页 > 解决方案 > 混合 spring-integration 和 spring 调度器

问题描述

我们正在混合使用spring-integrationspring-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 的默认值是 1(我们还需要避免在我们的计划进程中出现并发)。

问题

感谢您的回答

标签: spring-bootspring-integration

解决方案


行为和逻辑是正确的。从 Spring Boot 的角度来看,convention-on-configuration 的期望也是正确的。只有您错过@EnableScheduling的不是 Spring Boot 功能,而是 Spring Framework 原生:https ://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#scheduling 。Spring Boot jsut 给了我们额外的自由配置一些 bean 的事情。所以,我们只需要依赖它的自动配置。

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

在 Spring Boot 中查看@EnableScheduling,它的@Scheduled钩子和适当TaskSchedulingAutoConfiguration的,要同时覆盖任何你想让 Spring Integration 快乐的东西并不是那么容易。所以,我们应该采取相反的方向,真正覆盖SchedulerSpring 集成端点的 a 。您使用的每个地方poller,您还需要配置自定义Scheduler而不是自动配置。


推荐阅读