Spring integration 如何以互斥方式运行两个入站适配器

Spring integration 如何以互斥方式运行两个入站适配器,spring-integration,Spring Integration,在我的SI应用程序中有两个入站通道适配器,它们都提供相同的输出通道,然后通过一系列其他SI组件进行处理 第一个适配器每10分钟运行一次,而第二个适配器基于事件,可以随时运行(事实上,每100毫秒轮询一次新事件) 我希望这两个适配器一次运行一个。因此,例如,如果第一个适配器正在运行且其输出正在处理中,则第二个适配器应等待第一个适配器(因此其事务)完成。SI中是否有任何内置机制可用于实现此行为?您应该能够在上使用任务执行器,使用单个线程(例如池大小为1的ThreadPoolTaskExecutor)

在我的SI应用程序中有两个
入站通道适配器
,它们都提供相同的输出通道,然后通过一系列其他SI组件进行处理

第一个适配器每10分钟运行一次,而第二个适配器基于事件,可以随时运行(事实上,每100毫秒轮询一次新事件)


我希望这两个适配器一次运行一个。因此,例如,如果第一个适配器正在运行且其输出正在处理中,则第二个适配器应等待第一个适配器(因此其事务)完成。SI中是否有任何内置机制可用于实现此行为?

您应该能够在
上使用任务执行器,使用单个线程(例如池大小为1的
ThreadPoolTaskExecutor
),在其
rejectedExecutionHandler中使用
CallerBlocksPolicy
,队列大小为1


使用默认中止策略的队列大小为0也应该有效。

实际上,队列大小为0和中止策略也应该可以。不引入队列是否意味着事务将不再覆盖其余的处理?但是我需要处理这个问题。如果队列中没有空间,并且中止策略已就位,任务计划程序将无法启动轮询,因此事务甚至无法启动。如果线程可用,那么所有线程都将像以前一样工作。要使caller blocks策略起作用,队列必须至少有一个插槽,这样即使第二个插槽将被阻止,队列中也将始终有一个挂起的轮询。它没有按我希望的方式对我起作用。引入一个公共队列来捕获大小为1的适配器输出,在消息以大小为1的队列传递时提交入站通道适配器启动的事务,当我希望它仅在完成处理成功时提交,否则回滚。上面添加了一张图片来解释我在看什么,我需要适配器1工作时,适配器2不应该工作。有什么想法吗?谢谢你什么是“直接排队”?框架中没有这样的东西。我说过使用一个任务执行器和一个线程。