gpt4 book ai didi

java - 通过多个实例从一个文件夹中读取文件

转载 作者:行者123 更新时间:2023-11-30 08:00:41 25 4
gpt4 key购买 nike

我有一个文件夹,上游系统在其中转储为我的应用程序输入的文件。我的应用程序读取这些文件,处理它们,然后在某个目录中输出。由于输入文件的数量很大,我决定运行我的应用程序的多个实例,所有实例都将读取相同的输入目录以获取输入文件。现在,由于多个实例将读取同一个文件夹,如何防止多个实例同时读取同一个文件?

PS:我想过使用带有 NIO 锁的 Spring Integration,但是一旦你锁定文件,即使是同一个线程也将无法读取该文件。Camel 处理锁,但它会锁定整个目录,并且也不会处理 2 个实例试图获取尚未锁定的文件的那部分时间的场景。

任何建议都会有所帮助。

最佳答案

Spring Integration 为此提供了 FileSystemPersistentAcceptOnceFileListFilter。您可以使用共享的 ConcurrentMetadataStore impl 配置它,例如RedisMetadataStoreZookeeperMetadataStore

并且只有一个应用程序实例会接受一个文件。

尽管存在一些限制,即所有文件只能由一个实例应用:

private void scanInputDirectory() {
List<File> filteredFiles = this.scanner.listFiles(this.directory);
Set<File> freshFiles = new LinkedHashSet<File>(filteredFiles);
if (!freshFiles.isEmpty()) {
this.toBeReceived.addAll(freshFiles);
if (logger.isDebugEnabled()) {
logger.debug("Added to queue: " + freshFiles);
}
}
}

您可以使用分布式 MessageChannel 克服单例问题,例如SubscribableJmsChannelPublishSubscribeAmqpChannel 或任何其他基于MessageStore 的队列 channel 解决方案。

关于java - 通过多个实例从一个文件夹中读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38334056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com