Spring为QueueChannel集成了多个线程

时间:2016-03-27 10:05:05

标签: java spring spring-integration

我对集成流程有以下配置

@Bean(name = PollerMetadata.DEFAULT_POLLER)
PollerMetadata poller() {
    return Pollers.fixedRate(100)
            .maxMessagesPerPoll(1)
            .errorHandler(errorHandler)
            .get();
}

@Bean
IntegrationFlow f() {
    return IntegrationFlows.from(
            MessageChannels.queue("f.input", 500))
            ...
            .get();
}

因为我可以看到这个f流是异步的,这意味着当控制器调用向f.input队列发布消息的网关时,无论内部是什么{{1流量我有。这正是我想要的,但我不明白:

  1. 执行程序处理此异步流程的是什么?
  2. 在后台创建了多少个线程来支持此流程?
  3. 我的假设是否正确,除非队列中的一个项目完成执行,否则队列中的所有其他项目都会等待? (所以容量是1或这个队列)。
  4. 如何使此流程同时执行2个或3个队列项?
  5. 很抱歉有多个问题,但我想只需一个例子即可回答所有问题。

1 个答案:

答案 0 :(得分:0)

除非已经由应用程序定义,否则框架会创建一个“taskScheduler”bean。默认情况下,它有10个线程,并在所有轮询器(以及框架中的其他计划任务)之间共享。您可以增加线程数或完全覆盖默认bean。

您的理解是正确的,下一次轮询不会在当前轮询完成之前安排。

要连续运行多个请求,您可以向轮询器添加taskExcecutor(例如ThreadPoolTaskExecutor),并且轮询器线程将切换到其中一个线程,并且将调度下一个轮询立即

你需要小心,尽管你没有太快的民意调查来跟上游戏的步伐;否则任务执行者的工作队列将填满。

您可以通过限制执行程序的队列大小来解决该问题,并将RejectedExecutionHandler设置为ThreadPoolExecutor.CallerRunsPolicy,这将导致轮询器线程本身运行该任务。

或者,您可以使用配置了TE的ExecutorChannel并完全避免使用轮询器。控制器线程将简单地移交给TE,但您仍然需要CallerRunsPolicy