【问题标题】:file inbound adapter Multiple threads processing same file文件入站适配器 多个线程处理同一个文件
【发布时间】:2013-11-20 18:33:36
【问题描述】:

我们有一个 spring 集成应用程序,它将监视传入的文件夹,然后处理文件。我正在使用 prevent-duplicates="true" 但我必须更改为 false。 这里我解释了原因。 file inbound-channel-adapter performance issue

现在我看到多个线程处理同一个文件。感谢您的帮助!

<file:inbound-channel-adapter id="inFiles" channel="inFilesin" directory="file:${incoming.folder}" 
    queue-size="300" filename-regex="(?i)^(?!.*writing)" prevent-duplicates="false" auto-startup="true" auto-create-directory="false" >
        <int:poller id="fw.fileInboudPoller" fixed-rate="1" receive-timeout="3" time-unit="SECONDS"
            max-messages-per-poll="10" task-executor="taskExecutor" />
</file:inbound-channel-adapter>

<task:executor id="taskExecutor" pool-size="10-20" queue-capacity="20" rejection-policy="CALLER_RUNS" />

谢谢, 磨难

【问题讨论】:

    标签: spring integration spring-integration spring-rabbit


    【解决方案1】:

    正如您所发现的,当文件系统有大量文件时,很难进行扩展。

    您可能需要考虑替代技术、Rabbit、JMS 等。

    或者,您可以将自定义文件锁定器或目录扫描器实现为described here

    提供的 nio-locker 没有帮助,因为在这种情况下它不会阻止多线程访问。

    【讨论】:

    • 加里,感谢您的帮助。我们正在使用 Rabbit,该模块正在将文件从一个文件夹移动到另一个文件夹,然后在 DB 中创建一条记录,并向 Rabbit 发送一条消息。
    • 对,但我的观点来自您的另一个问题“当应用程序因维护或其他原因而关闭时,上游应用程序会在传入文件夹中填充 100K 文件。”让上游应用程序使用 Rabbit 而不是文件系统会更好。如果您无法将文件中的数据包含在 rabbit 消息中,那么至少使用 Rabbit 发送文件存在通知,而不是扫描文件系统上的数万个文件。
    • 这很好,但上游应用程序从不同来源收集文件,并且出于安全原因,该应用程序无权访问 Rabbit 和 DB。
    • 所以自定义扫描仪或储物柜可能是您唯一的选择。
    • Gary,我们仍然看到多个线程试图处理同一个文件,导致第二个线程抛出 java.io.FileNotFoundException。我在 Spring 4 ConcurrentMetadataStore / RedisMetadataStore 中看到了新的 API 支持。这可以防止多个线程在同一个 JVM 或不同的 JVM 上处理同一个文件吗?如果是,你能指点我示例或配置吗?-- Mohan
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多