【问题标题】:File inbound channel adapter process same file concurrently文件入站通道适配器同时处理同一个文件
【发布时间】:2016-05-28 22:07:28
【问题描述】:

我需要处理放在特定文件夹中的任何文件。这些文件可以具有相同的名称。稍后它将由专有 bean 处理,该 bean 将根据文件名的重复状态重命名文件扩展名(如果文件之前从未处理过,则为 xxx.origin 或相反条件为 xxx.duplicate)。

基于这个需求,我决定使用file-inbound-channel-adapter,搭配spring-integration-3.0.8。我将prevent-duplicates 属性设置为false,所以我可以处理所有文件。但是,我发现 2 个file-inbound-channel-adapter 可以同时处理 1 个文件(即使第二个适配器是意外创建的——在上下文和 servlet 中初始化了两次)。但这对我来说是个问题,因为我实际上打算创建超过 1 个file-inbound-channel-adapter 来处理同一文件夹中的所有文件,我得到的结果是 1 个输入文件同时被 2 个 bean 处理两次,这得到了me 2 输出文件(xxx.origin 和 xxx.duplicate)。我也不能使用FileLocker,因为file-to-string-transformer由于文件的锁定状态而无法工作。

有什么方法可以达到要求吗?

【问题讨论】:

    标签: spring spring-integration


    【解决方案1】:

    不清楚为什么需要多个适配器轮询同一个目录——如果需要实现并发处理,使用单个适配器并在轮询器中添加任务执行器(或使用下游执行器通道)。

    如果您必须有多个适配器实例,并且可以使用更新版本的 Spring Integration(4.1.7 或更高版本,当前版本为 4.2.6),您可以使用共享的 AcceptOnceFileListFilter,现在是 ResettableFileListFilter因此,当您重命名文件时,您可以将其从过滤器中删除。

    如果您无法使用更新版本的 Spring Integration,您将需要一个自定义 FileListFilter,它允许您在处理后删除文件。

    【讨论】:

    • 嗨,加里,感谢您的回复。我需要多个适配器轮询同一个目录,因为我的想法是让多个 bean 处理目录中的大量文件。因此,我想使用 4 个 bean,而不是 1 个 bean 来处理 100 个文件,以便更快地处理所有文件。目前我的配置是文件入站适配器-> 文本到字符串转换器-> 服务激活器-> 文件出站适配器。服务激活器是我处理文件的专有 bean。因此我认为我必须使用上述 4 组配置。
    • 但是您可以使用单个适配器和具有 4 个线程的池化任务执行器来实现相同的目标。
    • 嗨@GaryRussell,如果应用程序在多个服务器中运行(主动-主动)怎么办?您能否推荐任何方法来确保只有一台服务器会使用该文件?
    • 是的;不要对 4 年前的答案提出新问题。
    猜你喜欢
    • 1970-01-01
    • 2014-10-03
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多