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