我有一条路线,希望将各种文件复制到传入的文件夹中.该路线将继续将这些文件移动到临时文件夹中,在那里它将执行其他操作.路线如下:
<route id="incoming" >
<from uri="file://my/path/incoming"/>
<to uri="file://my/path/incoming/temp"/>
</route>
Run Code Online (Sandbox Code Playgroud)
问题是这些文件可能非常大.让我们说1Gb.为了将此文件复制到传入文件夹,可能需要10秒钟.在这10秒钟内,Consumer轮询目录并抛出异常,因为仍在复制部分文件.我可以使用哪种解决方法?
我使用readLock所有策略(主要是更改)但我得到一个例外:
(The process cannot access the file because it is being used by another process)
Run Code Online (Sandbox Code Playgroud)
修改后的uri如下:
<from uri="file://my/file/path?readLockCheckInterval=3000&readLock=changed"/>
Run Code Online (Sandbox Code Playgroud)
但是仍然没有运气
检查readLock" 文件"组件中的选项
消费者使用的,如果文件对文件具有独占读锁(即文件未在进行中或正在写入),则仅轮询文件.Camel将等待文件锁被授予.
此选项提供内置策略:
markerFile Camel创建一个标记文件(fileName.camelLock),然后对其进行锁定.
更改是使用文件长度/修改时间戳来检测文件当前是否正在被复制.至少会使用1秒.要确定这一点,所以此选项不能像其他文件一样快地使用文件,但可以更加可靠,因为JDK IO API无法始终确定文件当前是否正由另一个进程使用.选项readLockCheckInterval可用于设置检查频率.
fileLock用于使用java.nio.channels.FileLock.通过mount/share访问远程文件系统时应避免使用此方法,除非该文件系统支持分布式文件锁.
如果我们可以获得独占读锁,则重命名是用于尝试将文件重命名为测试.
| 归档时间: |
|
| 查看次数: |
6864 次 |
| 最近记录: |