我正在编写2条路由来处理目录中的文件,这些文件可以有任何名称,但我需要2条路由,因为我需要一些复杂的处理。
第一条路线:
<route id="Init">
<from uri="file:{{file.path}}?move=.done&moveFailed=.error&readLock=changed&readLockCheckInterval=1500&charset=UTF-8"/>
<transacted/>
<split streaming="true" stopOnException="true" shareUnitOfWork="true" parallelProcessing="false">
<tokenize token="\r\n"/>
<choice>
<when>
<simple>${body.substring(0,4)} == 4000</simple>
[...]
<to uri="file:{{file.path}}/tmp?fileName=${date:now:yyyyMMddss}.txt&fileExist=append&charset=UTF-8"/>
</when>
<when>
<simple>${body.substring(0,4)} == 4002</simple>
[...]
<to uri="file:{{file.path}}/tmp?fileName=${date:now:yyyyMMddss}.txt&fileExist=append&charset=UTF-8"/>
</when>
</choice>
</split>
</route>
第二条路线,它消耗第一条路线产生的文件:
<route id="End">
<from uri="file:{{file.path}}/tmp?delete=true&moveFailed=.error&readLock=changed&readLockCheckInterval=1500&charset=UTF-8"/>
<transacted/>
<split streaming="true" stopOnException="true" shareUnitOfWork="true" parallelProcessing="false">
<tokenize token="\r\n4000"/>
[...]
<to uri="[...]"/>
</split>
</route>
我正在尝试确保路由Init生成的文件不会被路由End消耗,直到Init处理完第一个文件为止。
我猜测使用临时文件扩展名,然后在第二个路由上使用exlude,但它不适用于fileExists。
有什么想法吗?
谢谢!
答案 0 :(得分:2)
使用完成文件
您需要一种机制来确保第二条路线仅消耗已由第一条路线完全处理的文件。
一个简单的方法是让第一个路由发出一个完成文件作为信号,告诉第二个路径文件已被处理完毕并准备好拾取。
要使用完成文件,您可以在处理完成时在第一个路径中添加doneFileName
参数,也可以使用相同的文件名模式添加第二个路径。
有关详情,请参阅Section "Using 'done' Files" of Camel File Component
答案 1 :(得分:0)
您不能将readLock=changed
与file
组件一起使用,因为它仅适用于从Camel 2.8开始的FTP / SFTP。
更改是使用文件长度/修改时间戳来检测文件当前是否正在被复制。至少会使用1秒。要确定这一点,所以此选项不能像其他文件一样快地使用文件,但可以更加可靠,因为JDK IO API无法始终确定文件当前是否正由另一个进程使用。选项readLockCheckInterval可用于设置检查频率。 此选项仅适用于从Camel 2.8开始的FTP组件。注意:从Camel 2.10.1开始,如果FTP服务器支持LIST操作,则可以启用FTP选项fastExistsCheck以加速此readLock策略使用完整的文件名(某些服务器可能没有)。
尝试其他机制之一,例如markerFile
,fileLock
或rename