对于最新的稳定版本,请使用 Spring Integration 6.4.0spring-doc.cn

配置 Task Scheduler

在 Spring 集成中,它起着消息总线的核心作用,你只需要考虑几个配置选项。 首先,您可能希望控制中央实例。 您可以通过提供一个名为 . 这也被定义为一个常量,如下所示:ApplicationContextTaskSchedulertaskSchedulerspring-doc.cn

IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME

默认情况下, Spring 集成依赖于 的实例,如 Spring Framework 参考手册的 Task Execution and Scheduling 部分所述。 该默认值会自动使用包含 10 个线程的池启动,但请参阅 Global Properties。 如果您提供自己的实例,则可以将 'autoStartup' 属性设置为或提供您自己的池大小值。ThreadPoolTaskSchedulerTaskSchedulerTaskSchedulerfalsespring-doc.cn

当轮询使用者在其配置中提供显式任务执行程序引用时,处理程序方法的调用发生在该执行程序的线程池中,而不是主计划程序池中。 但是,当没有为端点的 Poller 提供任务执行程序时,它由主调度程序的线程之一调用。spring-doc.cn

不要在 Poller 线程上运行长时间运行的任务。 请改用任务执行程序。 如果有很多轮询终端节点,则可能会导致线程匮乏,除非增加池大小。 此外,轮询使用者的默认值为 1 秒。 由于 poller 线程此时会阻塞,因此我们建议您在存在许多此类端点时使用 task executor,以避免匮乏。 或者,您也可以减少 .receiveTimeoutreceiveTimeout
如果终端节点的 input 通道是基于队列的 (即 pollable) 通道之一,则该终端节点是 Polling Consumer 。 事件驱动型使用者是指那些具有调度程序而不是队列的输入通道的使用者(换句话说,它们是可订阅的)。 这样的端点没有 Poller 配置,因为它们的处理程序是直接调用的。

在 JEE 容器中运行时,您可能需要使用 Spring 的 ,如此所述,而不是默认的 . 为此,请为您的环境定义一个具有适当 JNDI 名称的 Bean,如下例所示:TimerManagerTaskSchedulertaskSchedulerspring-doc.cn

<bean id="taskScheduler" class="org.springframework.scheduling.concurrent.DefaultManagedTaskScheduler">
    <property name="jndiName" value="tm/MyTimerManager" />
    <property name="resourceRef" value="true" />
</bean>
在应用程序上下文中配置自定义时(如上文所述),建议为其提供 ( bean) ,以便能够作为框架提供的 bean 处理异常。TaskSchedulerDefaultManagedTaskSchedulerMessagePublishingErrorHandlerintegrationMessagePublishingErrorHandlerErrorMessage`s sent to the error channel, as is done with the default `TaskScheduler

有关更多信息,另请参阅 错误处理spring-doc.cn