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

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

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

  • 在处理所有轮询器1消息之前,轮询器2根本不会运行
  • Poller#2正在运行(但如果只有一个线程,它怎么能运行呢?),它的消息会存储起来,以便在处理所有Poller#1消息时供以后使用
  • 轮询器1启动的处理被中断,轮询器2运行,生成的消息立即传递到处理链
  • 其他答案

  • 请注意,我的所有通道都是直接通道,没有使用任务执行器。

    轮询器是由公共
    任务调度器
    bean处理的独立任务;只要任务调度器有足够的线程,轮询器之间就没有协调

    如果池耗尽,轮询器将“迟到”


    默认情况下,
    taskScheduler
    有10个线程;但是你可以。

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

    我的情况是:

  • 我有4个轮询器,分别从4个不同的位置请求数据 阻塞队列(我为每个队列设置了1秒的超时)
  • 我有4个入站通道适配器,配置为使用固定延迟(100ms)和上述轮询器(一对一)
  • 我有一个线程池,具有4个核心线程/max,配置为处理入站通道适配器(所有适配器都使用此池)
  • 现在我在日志中看到,每个线程依次执行所有轮询器,如果有一个空队列(我使用的是阻塞队列),那么所有线程都会延迟1秒这意味着,即使您有足够的线程,如果至少有一个轮询器运行缓慢,您仍然可能会获得所有线程的延迟。例如,如果我根本不使用超时来读取队列,那么所有线程都将停在空队列上,并且不会从所有其他非空队列中读取任何内容

    为了解决这个问题,我想我们需要为每个轮询绑定的通道适配器配置单独的线程池