如需使用最新稳定版本,请使用 Spring Integration 7.0.4spring-doc.cadn.net.cn

配置任务调度器

在 Spring Integration 中,ApplicationContext扮演着消息总线的核心角色,您只需考虑少数几个配置选项。 首先,您可能希望控制中央TaskScheduler实例。 您可以通过提供一个名为taskScheduler的单个 Bean 来实现这一点。 这也定义为一个常量,如下所示:spring-doc.cadn.net.cn

IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME

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

当轮询消费者在配置中提供显式的任务执行器引用时,处理器方法的调用会在该执行器的线程池中进行,而不是在主调度器池中。 然而,当为端点的轮询器未提供任务执行器时,它将由主调度器的一个线程进行调用。spring-doc.cadn.net.cn

不要在轮询线程上运行长时间运行的任务。 请使用任务执行器代替。 如果您有很多轮询端点,可能会导致线程饥饿,除非您增加线程池大小。 此外,轮询消费者默认有一个 receiveTimeout 为一秒的间隔。 由于轮询线程在此期间会被阻塞,因此我们建议当存在许多此类端点时使用任务执行器,再次以避免线程饥饿。 或者,您可以减少 receiveTimeout 的值。
如果端点的输入通道是基于队列的(即可轮询)通道之一,则该端点为轮询消费者。 事件驱动型消费者是指那些具有分发器而非队列的输入通道的消费者(换句话说,它们是可订阅的)。 此类端点没有轮询器配置,因为它们的处理器是直接调用的。

当在 JEE 容器中运行时,您可能需要使用 Spring 的TimerManagerTaskScheduler(如此处所述),而不是默认的taskScheduler。 为此,请根据您的环境定义一个具有相应 JNDI 名称的 Bean,如下例所示:spring-doc.cadn.net.cn

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

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