我有一个带有多个入站通道适配器的Spring Integration上下文,每个适配器都有自己的轮询器(目前所有轮询器的刷新时间都配置了固定延迟,但将来可能会使用固定速率)。所有入站适配器都将其生成的消息输出到同一个处理链。问题是在这种情况下轮询和消息消费的行为是什么?想象一下,poller#1已生成1000条消息,并将它们交给我的处理链。由于处理可能需要一些重要的时间,因此轮询器#2可能有时间完成其工作并可能产生消息。但请记住 - 我的处理链仍在处理轮询器#1传递的消息。会发生什么?
请注意,我的所有频道都是直接频道,并且没有使用任务执行器。
答案 0 :(得分:1)
轮询器是由公共taskScheduler
bean处理的独立任务;只要任务调度程序有足够的线程,就不会在轮询器之间进行协调。
如果游泳池用尽,投票人将会迟到"
默认情况下,taskScheduler
有10个主题;但你可以reconfigure it。
答案 1 :(得分:0)
我的情况几乎相同,但行为有点不同。
我的情况是:
现在我在日志中看到每个线程都会执行所有轮询器,如果有一个空队列(我正在使用阻塞队列),那么所有线程都会延迟1秒。 这意味着即使你有足够的线程,如果至少有一个轮询器很慢,你仍然可能会延迟所有线程。例如,如果我根本不使用超时队列读取,那么所有线程都会停止在空队列中,不会从所有其他非空队列中读取任何内容。
要解决此问题,我想我们需要为每个轮询器< - >入站通道适配器配置单独的线程池。