配置任务计划程序
在 Spring Integration 中,ApplicationContext
扮演着消息总线的核心角色,您只需要考虑几个配置选项。首先,您可能想要控制中央 TaskScheduler
实例。可以通过提供一个名为 taskScheduler
的单个 bean 来实现。这也被定义为一个常量,如下所示:
IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME
当轮询消费者在其配置中提供了一个明确的任务执行器引用时,处理程序方法的调用会在该执行器的线程池内发生,而不是在主线程调度池中。但是,当没有为端点的轮询器提供任务执行器时,它将由主线程调度器的一个线程调用。
不要在轮询线程上运行长时间任务。而是使用任务执行器。如果你有很多轮询端点,除非增加池大小,否则可能会导致线程饥饿。此外,轮询消费者有一个默认 receiveTimeout
为一秒。由于轮询线程在此时间内被阻塞,我们建议当存在许多此类端点时使用任务执行器,以避免线程饥饿。或者,你可以减少 receiveTimeout
。
如果端点的输入通道是基于队列的(即,可轮询的)通道之一,则该端点是一个轮询消费者。事件驱动的消费者是指那些具有分发器而不是队列的输入通道(换句话说,它们是可以订阅的)。此类端点没有轮询配置,因为其处理器是直接被调用的。
当在 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>
当在应用程序上下文中配置自定义 TaskScheduler
(如上述的 DefaultManagedTaskScheduler
)时,建议为其提供一个 MessagePublishingErrorHandler
(integrationMessagePublishingErrorHandler
bean),以便能够处理作为 ErrorMessage
发送到错误通道的异常,就像框架提供的默认 TaskScheduler
bean 所做的那样。
更多信息请参见 错误处理。