我对集成流程有以下配置
@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流量我有。这正是我想要的,但我不明白:
很抱歉有多个问题,但我想只需一个例子即可回答所有问题。
答案 0 :(得分:0)
除非已经由应用程序定义,否则框架会创建一个“taskScheduler”bean。默认情况下,它有10个线程,并在所有轮询器(以及框架中的其他计划任务)之间共享。您可以增加线程数或完全覆盖默认bean。
您的理解是正确的,下一次轮询不会在当前轮询完成之前安排。
要连续运行多个请求,您可以向轮询器添加taskExcecutor
(例如ThreadPoolTaskExecutor
),并且轮询器线程将切换到其中一个线程,并且将调度下一个轮询立即
你需要小心,尽管你没有太快的民意调查来跟上游戏的步伐;否则任务执行者的工作队列将填满。
您可以通过限制执行程序的队列大小来解决该问题,并将RejectedExecutionHandler
设置为ThreadPoolExecutor.CallerRunsPolicy
,这将导致轮询器线程本身运行该任务。
或者,您可以使用配置了TE的ExecutorChannel
并完全避免使用轮询器。控制器线程将简单地移交给TE,但您仍然需要CallerRunsPolicy
。