Cur*_*urt 5 java spring apache-camel
我有一个客户ftp的文件到我们的服务器.我有一个路由定义从该目录中选择某些文件,并将它们移动到另一个目录进行处理.问题是它只要看到它就会立即使用它,并且不会等到ftp完成.结果是在uri中描述的路径中的0字节文件.我已经尝试了每个readLock选项(masterFile,rename,changed,fileLock),但没有一个有效.我使用spring DSL来定义我的骆驼路线.这是一个不起作用的例子.骆驼版是2.10.0
<route>
<from uri="file:pathName?initialDelay=10s&move=ARCHIVE&sortBy=ignoreCase:file:name&readLock=fileLock&readLockCheckInterval=5000&readLockTimeout=10m&filter=#FileFilter" />
<to uri="file:pathName/newDirectory/" />
</route>
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.谢谢!
请注意......有一次,这条路由在不同的服务器上运行,我不得不将文件ftp到另一台处理它的服务器上.当我在骆驼中使用ftp组件时,该路由工作正常.那就是在执行ftp之前它一直等到收到文件.我在定义的路线上有相同的选项.这就是为什么我认为应该有一种方法来实现它,因为ftp组件使用camel中的文件组件选项.
我正在接受@ PeteH的建议#2并做了以下事情.我仍然希望有另一种方式,但这将有效.
我添加了以下方法,返回一个date.minus(x秒)的日期
public static Date getDateMinusSeconds(Integer seconds) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, seconds);
return cal.getTime();
}
Run Code Online (Sandbox Code Playgroud)
然后在我的过滤器中检查初始过滤是否为真.如果是,我将Last修改日期与getDateMinusSeconds()进行比较.如果比较为真,我会为过滤器返回false.
if(filter){
if(new Date(pathname.getLastModified()).after(DateUtil.getDateMinusSeconds(-30))){
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有在你的环境中做过这些,但在使用FTP之前遇到过这种问题.
我建议的两个更好的选择是,如果你可以让客户发送两个文件.File1是他们的数据,File2可以是任何东西.他们按顺序发送.当File2到达时你陷阱,但你所做的只是将它作为File1安全到达的"信号".
不太好的选项(这是我们最终实现的选项,因为我们无法控制正在发送的文件)是编写代码,以便您拒绝处理任何文件,直到其上次修改时间戳至少为x分钟.我想我们5分钟就定了.这非常可怕,因为你基本上是开火,检查,睡觉,检查等.
但是你描述的问题在FTP上是众所周知的.就像我说的,我不知道这些方法中的任何一种是否适用于您的环境,但肯定在高水平它们是合理的.