配置任务调度器
在 Spring Integration 中,ApplicationContext 扮演着消息总线的核心角色,你只需考虑几个配置选项。首先,你可能希望控制中央的 TaskScheduler 实例。你可以通过提供一个名为 taskScheduler 的单例 bean 来实现。这也被定义为一个常量,如下所示
IntegrationContextUtils.TASK_SCHEDULER_BEAN_NAME
默认情况下,Spring Integration 依赖于 ThreadPoolTaskScheduler 的一个实例,如 Spring Framework 参考手册的任务执行和调度部分所述。默认的 TaskScheduler 会自动启动,并带有一个包含十个线程的线程池,但请参阅全局属性。如果你提供自己的 TaskScheduler 实例,则可以将 'autoStartup' 属性设置为 false 或提供自己的线程池大小值。
当轮询消费者在其配置中提供明确的任务执行器引用时,处理程序方法的调用会在该执行器的线程池中发生,而不是在主调度器线程池中。然而,如果端点的轮询器未提供任务执行器,则它会由主调度器的一个线程调用。
请勿在轮询线程上运行长时间任务。请改用任务执行器。如果您的轮询端点很多,除非增加线程池大小,否则可能会导致线程饥饿。此外,轮询消费者默认的 receiveTimeout 为一秒。由于轮询线程会阻塞这段时间,因此当存在许多此类端点时,我们建议您使用任务执行器,以再次避免饥饿。或者,您可以减少 receiveTimeout。 |
| 如果其输入通道是基于队列(即,可轮询)的通道,则该端点是轮询消费者。事件驱动型消费者是指其输入通道具有分发器而不是队列(换句话说,它们是可订阅的)的端点。此类端点没有轮询器配置,因为其处理程序是直接调用的。 |
|
在 JEE 容器中运行时,您可能需要使用 Spring 的
|
当应用程序上下文中配置了自定义 TaskScheduler(如上述的 DefaultManagedTaskScheduler)时,建议为其提供一个 MessagePublishingErrorHandler(integrationMessagePublishingErrorHandler bean),以便能够将异常作为发送到错误通道的 ErrorMessage`s 处理,就像框架提供的默认 `TaskScheduler bean 所做的那样。 |
有关更多信息,另请参阅错误处理。