我使用Spring 4.3.8和Spring集成4.3.9。我期望同时处理具有不同队列的多个文件。例如,有一些文件的文件名为A001,A002,A003,B001,B002,B003。我想异步处理Axxx和Bxxx。在完成处理A001和B001之后,将处理A002和B002。队列A和队列B不会相互影响,这意味着A003可以在A002完成后处理,无论B002是否完成。我不知道那样做。
我所做的工作如下所示。
<int-file:inbound-channel-adapter id="inFiles" directory="${integration.input.folder.path}" filename-regex="^A.*\.dat$|^B.*\.tsv$"
comparator="fileOrderComparator"
prevent-duplicates="false" >
<int:poller fixed-delay="10000" task-executor="taskExecutor" max-messages-per-poll="5" />
</int-file:inbound-channel-adapter>
<task:executor id="taskExecutor" pool-size="8" />
<int-file:outbound-gateway id="inFileProcessingGateway" directory="${integration.processing.folder.path}" request-channel="inFiles"
reply-channel="processFile" auto-create-directory="true" delete-source-files="true" />
但是它会异步处理A001,A002,B001,B002,这不是我的预期。
答案 0 :(得分:0)
为了实现这一目标(尽管尚不清楚是什么原因),您肯定需要根据并行性要求使用max-messages-per-poll
。收到每个设置后,您需要停止通道适配器。您可以使用AbstractMessageSourceAdvice
:https://docs.spring.io/spring-integration/docs/5.0.3.RELEASE/reference/html/messaging-channels-section.html#conditional-pollers执行此操作。执行完所有这些任务后,收集它们以确定您准备好下一组要轮询的文件的时刻非常棒。然后再次启动文件读取通道适配器。出于目的,您可以使用聚合器:https://docs.spring.io/spring-integration/docs/5.0.3.RELEASE/reference/html/messaging-routing-chapter.html#aggregator
<强>更新强>
因为我不希望Axxx和Bxxx的进程队列相互影响。也许A002没有完成但B002没有完成,B003可以先开始处理,无需等待A002完成。这可能吗?
是的,这是一个有点不同的场景,可以通过非常简单的步骤来完成:
task-executor
<int-file:inbound-channel-adapter>
Router
作为<int-file:inbound-channel-adapter>
输出频道的订阅者。在此路由器中,可以检查A
和B
模式的有效负载。或者对适当的FileHeaders.FILENAME
标头执行相同的操作。因此,将A
路由到一个频道,将B
路由到另一个频道。A
,因此您确实需要为这两个路由器的订户使用QueueChannel
。不应为ExecutorChannel
配置它们的轮询使用者,以避免类似A
文件的并发任务。将从自己的队列中轮询B
个文件。这就是你将A
和B
在一个队列中支持顺序进程的并行性。