如何使用入站通道适配器处理不同队列中的多个文件

时间:2018-03-05 02:33:38

标签: xml spring-integration

我使用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,这不是我的预期。

1 个答案:

答案 0 :(得分:0)

为了实现这一目标(尽管尚不清楚是什么原因),您肯定需要根据并行性要求使用max-messages-per-poll。收到每个设置后,您需要停止通道适配器。您可以使用AbstractMessageSourceAdvicehttps://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完成。这可能吗?

是的,这是一个有点不同的场景,可以通过非常简单的步骤来完成:

  1. 您未在task-executor
  2. 上使用<int-file:inbound-channel-adapter>
  3. 您使用Router作为<int-file:inbound-channel-adapter>输出频道的订阅者。在此路由器中,可以检查AB模式的有效负载。或者对适当的FileHeaders.FILENAME标头执行相同的操作。因此,将A路由到一个频道,将B路由到另一个频道。
  4. 由于您无法并行处理多个A,因此您确实需要为这两个路由器的订户使用QueueChannel。不应为ExecutorChannel配置它们的轮询使用者,以避免类似A文件的并发任务。将从自己的队列中轮询B个文件。这就是你将AB在一个队列中支持顺序进程的并行性。