多个入站通道适配器/轮询器在单个上下文中的行为

时间:2016-01-27 13:39:58

标签: spring-integration

我有一个带有多个入站通道适配器的Spring Integration上下文,每个适配器都有自己的轮询器(目前所有轮询器的刷新时间都配置了固定延迟,但将来可能会使用固定速率)。所有入站适配器都将其生成的消息输出到同一个处理链。问题是在这种情况下轮询和消息消费的行为是什么?想象一下,poller#1已生成1000条消息,并将它们交给我的处理链。由于处理可能需要一些重要的时间,因此轮询器#2可能有时间完成其工作并可能产生消息。但请记住 - 我的处理链仍在处理轮询器#1传递的消息。会发生什么?

  1. 在处理完所有轮询器#1消息之前,根本不运行轮询器#2。
  2. Poller#2正在运行(但是如果我们只有一个线程,它怎么能运行呢?),它的消息被存储起来供以后在处理所有poller#1消息时使用。
  3. 轮询器#1启动的处理被中断,轮询器#2运行,生成的消息立即传递给处理链。
  4. 其他答案
  5. 请注意,我的所有频道都是直接频道,并且没有使用任务执行器。

2 个答案:

答案 0 :(得分:1)

轮询器是由公共taskScheduler bean处理的独立任务;只要任务调度程序有足够的线程,就不会在轮询器之间进行协调。

如果游泳池用尽,投票人将会迟到"

默认情况下,taskScheduler有10个主题;但你可以reconfigure it

答案 1 :(得分:0)

我的情况几乎相同,但行为有点不同。

我的情况是:

  1. 我有4个轮询器,它们独立于4个不同的请求数据 阻止队列(我已为每个队列设置超时1秒)
  2. 我有4个入站通道适配器配置为使用固定延迟(100毫秒)和上面的轮询器(一对一)。
  3. 我有4个线程核心/最大线程池,配置为处理入站通道适配器(所有适配器都使用此池)
  4. 现在我在日志中看到每个线程都会执行所有轮询器,如果有一个空队列(我正在使用阻塞队列),那么所有线程都会延迟1秒。 这意味着即使你有足够的线程,如果至少有一个轮询器很慢,你仍然可能会延迟所有线程。例如,如果我根本不使用超时队列读取,那么所有线程都会停止在空队列中,不会从所有其他非空队列中读取任何内容。

    要解决此问题,我想我们需要为每个轮询器< - >入站通道适配器配置单独的线程池。