我有一个客户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) 我定义了10条路线,其中2条列在此处.其他8个是相同的,但是从端点是不同的目录.每个路由选取一个位于目录中的文件,并由一个groovy类处理.当一个文件被放入其中一个目录时,它工作正常,但是当一个文件同时被丢弃到每个目录中时,每个线程似乎都会变得混乱.我确实收到了我已经获取每个文件的日志消息,但似乎每个线程使用一个进程"beginProcess",因为它像groovy中定义的所有变量一样,每个文件被拾取时都会被更改.我不确定这是否有任何意义,但有人可以告诉我,我在下面做的是合法的吗?基本上可以多个路由调用一个类,如果是,我是否正确这样做?如果它是至少我会知道它必须在我的groovy类(但看到它适用于一个文件表明它不在这里,但不假设在这一点).非常感谢!
<camel:camelContext id="myId"
xmlns="http://camel.apache.org/schema/spring">
<route>
<from
uri="file://directoryStructure1/?move=archive&sortBy=ignoreCase:file:name&readLock=markerFile&readLockCheckInterval=5000&readLockTimeout=10m&maxMessagesPerPoll=1" />
<process ref="beginProcess"></process>
</route>
<route>
<from
uri="file://directoryStructure2/?move=archive&sortBy=ignoreCase:file:name&readLock=markerFile&readLockCheckInterval=5000&readLockTimeout=10m&maxMessagesPerPoll=1" />
<process ref="beginProcess"></process>
</route>
</camel:camelContext>
<bean id="beginProcess" class="package.groovy.class"> </bean>
Run Code Online (Sandbox Code Playgroud)