Configuring the Task Scheduler
在 Spring Integration 中,ApplicationContext
扮演消息总线的中心角色,您只需要考虑几个配置选项。首先,您可能想要控制中央 TaskScheduler
实例。您可以通过提供名为 taskScheduler
的单个 bean 来实现此目的。它还被定义为一个常量,如下所示:
IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME
默认情况下,Spring Integration 依赖 `ThreadPoolTaskScheduler`的实例,如 Spring 框架参考手册的 Task Execution and Scheduling部分中所述。该默认 `TaskScheduler`会自动启动,并带有十个线程的池,但请参阅 Global Properties。如果您自己提供 `TaskScheduler`实例,则可以将“autoStartup”属性设置为 `false`或提供您自己的池大小值。
当轮询使用者在其配置中提供显式任务执行程序引用时,处理程序方法的调用发生在该执行程序的线程池中,而不是主调度程序池中。但是,当未为端点的轮询器提供任务执行程序时,它将由一个主调度程序线程调用。
不要在轮询线程上运行长时间运行的任务。请改用任务执行器。如果您有许多轮询端点,可能会导致线程饥饿,除非您增加池的大小。此外,轮询使用者的默认 receiveTimeout
为一秒。由于轮询线程会阻塞此时间,因此当存在许多这样的端点时,我们建议您使用任务执行器,再次避免饥饿。或者,您可以减小 receiveTimeout
。
如果其输入通道是基于队列(即,可轮询)的通道之一,则该端点为轮询使用者。事件驱动的使用者是具有派发器而不是队列作为输入通道的使用者(换句话说,它们是可订阅的)。此类端点没有轮询器配置,因为其处理程序被直接调用。 |
在 JEE 容器中运行时,您可能需要使用 Spring 的 TimerManagerTaskScheduler
,如 here中所述,而不是默认的 taskScheduler
。为此,请使用以下示例所示,定义带有与环境相匹配的适当 JNDI 名称的 bean:
<bean id="taskScheduler" class="org.springframework.scheduling.concurrent.DefaultManagedTaskScheduler">
<property name="jndiName" value="tm/MyTimerManager" />
<property name="resourceRef" value="true" />
</bean>
在应用程序上下文中配置自定义 TaskScheduler
时(比如上面提到的 DefaultManagedTaskScheduler
),建议向它提供一个 MessagePublishingErrorHandler
(integrationMessagePublishingErrorHandler
bean)以能够处理异常,就像框架提供的 ErrorMessage`s sent to the error channel, as is done with the default `TaskScheduler
bean 一样。
有关更多信息,另请参阅 Error Handling。