【问题标题】:Behaviour of multiple inbound channel adapters/pollers in a single context单个上下文中多个入站通道适配器/轮询器的行为
【发布时间】:2016-01-27 13:39:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: spring-integration


    【解决方案1】:

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

    如果池耗尽,轮询器将“延迟”运行。

    taskScheduler 默认有 10 个线程;但你可以reconfigure it

    【讨论】:

      【解决方案2】:

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

      我的情况是:

      1. 我有 4 个轮询器,它们独立于 4 个不同的请求数据 阻塞队列(我已为每个队列设置了 1 秒的超时时间)
      2. 我有 4 个入站通道适配器配置为使用固定延迟 (100ms) 和上述轮询器(一对一)。
      3. 我有 4 个线程核心/最大值的线程池,配置为处理入站通道适配器(所有适配器都使用此池)

      现在我在日志中看到每个线程依次执行所有轮询器,如果有一个空队列(我正在使用 阻塞队列),那么所有线程都会延迟 1 秒。 这意味着即使你有足够多的线程,如果至少有一个轮询器很慢,你的所有线程仍然可能会延迟。例如,如果我根本不使用超时来读取队列,那么所有线程都会停止在空队列上,不会从所有其他非空队列中读取任何内容。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-28
        • 2015-09-06
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 2015-11-11
        • 1970-01-01
        • 2019-12-04
        相关资源
        最近更新 更多