首页 > 解决方案 > 如何在流式传输时重命名放置在远程位置的文件

问题描述

我想在从远程目录流式传输文件时向文件添加一些临时后缀。

我正在使用 spring 集成 dsl 从远程目录流式传输文件,并且我想确保一个文件一次被单个应用程序读取。所以我正在考虑在文件流式传输时向文件添加一些临时前缀。我正在使用出站网关来获取数据。

任何指针都会非常有帮助。目前我在阅读之前和阅读之后重命名文件,我真的不想这样做。

标签: javastreamingfile-renamespring-integration-sftp

解决方案


考虑使用文件锁定,而不是重命名。这是13.2 Reading Files spring-integration文档中的相关部分:

当多个进程从同一个目录读取时,可能需要锁定文件以防止它们被同时拾取。为此,您可以使用 FileLocker。有一个开箱即用的基于 java.nio 的实现,但也可以实现您自己的锁定方案。nio locker可以如下注入:

<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>

【注意】当文件入站适配器配置了locker时,它会在文件被允许接收之前负责获取锁。它不会承担解锁文件的责任。如果您已经处理了文件并保持锁在您身边,那么您就有内存泄漏。如果这对您来说是个问题,您应该在适当的时候自己调用 FileLocker.unlock(File file)。

有关更多信息,请参阅Interface FileLockerClass NioFileLocker的文档。


推荐阅读