此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1spring-doc.cadn.net.cn

配置任务计划程序

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

IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME

默认情况下,Spring Integration 依赖于ThreadPoolTaskScheduler,如 Spring Framework 参考手册的 Task Execution and Scheduling 部分所述。默认值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),建议为其提供MessagePublishingErrorHandler (integrationMessagePublishingErrorHandlerbean)能够处理异常ErrorMessage`s sent to the error channel, as is done with the default `TaskScheduler框架提供的 bean。

另请参阅错误处理以获取更多信息。spring-doc.cadn.net.cn