我想在从远程目录流式传输文件时向文件添加一些后缀。
我正在使用Spring Integration dsl从远程目录流式传输文件,并且我想确保单个应用程序一次读取一个文件。所以我正在考虑在流式传输时向文件添加一些临时前缀。我正在使用出站网关来获取数据。
任何指针都将非常有帮助。目前,我要在读取之前和读取之后重命名文件,我真的不想这么做。
答案 0 :(得分:1)
考虑使用文件锁定而不是重命名。这是13.2 Reading Files
spring-integration文档中的相关部分:
当多个进程从同一目录中读取时,可能希望锁定文件以防止同时拾取它们。为此,您可以使用FileLocker。现成的基于Java.nio的实现可用,但是也可以实现自己的锁定方案。 nio储物柜可以按以下方式注入:
<int-file:inbound-channel-adapter id="filesIn"
directory="file:${input.directory}" prevent-duplicates="true">
<int-file:nio-locker/>
</int-file:inbound-channel-adapter>
您可以这样配置的自定义储物柜:
<int-file:inbound-channel-adapter id="filesIn"
directory="file:${input.directory}" prevent-duplicates="true">
<int-file:locker ref="customLocker"/>
</int-file:inbound-channel-adapter>
[注意] 当文件入站适配器配置有储物柜时,它将负责在允许接收文件之前获取锁。它不承担解锁文件的责任。如果您已经处理了文件并保持锁定状态,则可能会导致内存泄漏。如果这是您的问题,则应在适当的时候自行调用FileLocker.unlock(File file)。
有关更多信息,请参阅Interface FileLocker和Class NioFileLocker的文档。
答案 1 :(得分:0)
我将使用Apache Commons FileUtils。 https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FileUtils.html#moveFile
通常,我要做的是在初始传输到临时工作目录时写入文件。文件完全传输后,我将执行校验和以确保文件正确。此时,我将文件移至其他应用程序逻辑正在使用的最终目录。只要工作目录和最终目录位于同一文件系统上,此移动将是原子的。这将保证使用该文件的应用程序不同部分之间不存在竞争条件。