跳到主要内容
版本:7.0.2

配置任务调度器

DeepSeek V3 中英对照 Configuring the Task Scheduler

在Spring Integration中,ApplicationContext扮演着消息总线的核心角色,您只需考虑几个配置选项。首先,您可能需要控制中央的TaskScheduler实例。您可以通过提供一个名为taskScheduler的单一bean来实现。该名称也被定义为常量,如下所示:

IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME

默认情况下,Spring Integration 依赖于 ThreadPoolTaskScheduler 的一个实例,如 Spring Framework 参考手册的任务执行与调度部分所述。该默认的 TaskScheduler 会自动启动,并带有一个包含十个线程的线程池,但请参阅全局属性。如果您提供了自己的 TaskScheduler 实例,则可以将 autoStartup 属性设置为 false,或提供您自己的线程池大小值。

当轮询消费者在其配置中提供了明确的任务执行器引用时,处理器方法的调用将在该执行器的线程池内进行,而非主调度器池。然而,当端点轮询器未提供任务执行器时,其调用将由主调度器的某个线程执行。

警告

不要在轮询器线程上运行长时间运行的任务。请改用任务执行器。如果你有很多轮询端点,除非增加线程池大小,否则可能导致线程饥饿。此外,轮询消费者默认的 receiveTimeout 为一秒。由于轮询线程在此期间会阻塞,我们建议在存在许多此类端点时使用任务执行器,以避免线程饥饿。或者,你也可以减少 receiveTimeout 的值。

备注

如果一个端点的输入通道是基于队列(即可轮询)的通道,那么它就是一个轮询消费者。事件驱动消费者则是指那些输入通道具有分发器而非队列(换句话说,它们是可订阅的)的端点。这类端点没有轮询器配置,因为它们的处理器是直接被调用的。

important

在 JEE 容器中运行时,你可能需要使用 Spring 的 TimerManagerTaskScheduler(如此处所述),而不是默认的 taskScheduler。为此,请根据你的环境定义一个具有适当 JNDI 名称的 bean,如下例所示:

<bean id="taskScheduler" class="org.springframework.scheduling.concurrent.DefaultManagedTaskScheduler">
<property name="jndiName" value="tm/MyTimerManager" />
<property name="resourceRef" value="true" />
</bean>
important

当在应用程序上下文中配置了自定义的 TaskScheduler(例如上述的 DefaultManagedTaskScheduler)时,建议为其提供一个 MessagePublishingErrorHandlerintegrationMessagePublishingErrorHandler bean),以便能够将异常作为 ErrorMessage 发送到错误通道进行处理,这与框架提供的默认 TaskScheduler bean 的处理方式一致。

另请参阅错误处理获取更多信息。