gpt4 book ai didi

java - Camel 路线在ftp完成之前拾取文件

转载 作者:搜寻专家 更新时间:2023-10-31 19:40:13 24 4
gpt4 key购买 nike

我有一位客户通过 ftp 将文件传输到我们的服务器。我定义了一条路线,用于从此目录中选择某些文件并将它们移动到不同的目录进行处理。问题是它一看到它就把它拿走,而不是等到 ftp 完成。结果是 to uri 中描述的路径中的 0 字节文件。我已经尝试了每个 readLock 选项(masterFile、rename、changed、fileLock),但都没有用。我正在使用 spring DSL 来定义我的 Camel 路线。这是一个不起作用的例子。 Camel 版本是2.10.0

    <route>
<from uri="file:pathName?initialDelay=10s&amp;move=ARCHIVE&amp;sortBy=ignoreCase:file:name&amp;readLock=fileLock&amp;readLockCheckInterval=5000&amp;readLockTimeout=10m&amp;filter=#FileFilter" />
<to uri="file:pathName/newDirectory/" />
</route>

如有任何帮助,我们将不胜感激。谢谢!

请注意...有一次这条路线在另一台服务器上运行,我不得不将文件通过 ftp 传输到另一台处理它的服务器。当我在 Camel 中使用 ftp 组件时,该路由工作正常。那就是在执行 ftp 之前它确实等到收到文件。我在定义的路线上有相同的选项。这就是为什么我认为应该有一种方法可以做到这一点,因为 ftp 组件使用 camel 中的文件组件选项。


我采纳了@PeteH 的建议 #2 并执行了以下操作。我仍然希望有另一种方法,但这会奏效。

我添加了以下方法,该方法返回一个日期为 current.minus(x seconds)

public static Date getDateMinusSeconds(Integer seconds) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, seconds);
return cal.getTime();
}

然后在我的过滤器中检查初始过滤是否正确。如果是,我将上次修改日期与 getDateMinusSeconds() 进行比较。如果比较结果为真,我会为过滤器返回一个假值。

    if(filter){
if(new Date(pathname.getLastModified()).after(DateUtil.getDateMinusSeconds(-30))){
return false;
}
}

最佳答案

我没有在您的环境中执行过任何此类操作,但之前使用 FTP 时遇到过此类问题。

我可以建议的两个更好的选择是让客户发送两个文件。 File1 是他们的数据,File2 可以是任何东西。他们按顺序发送。您在 File2 到达时设陷阱,但您所做的只是将其用作 File1 已安全到达的“信号”。

不太好的选择(这是我们最终实现的一个,因为我们无法控制正在发送的文件)是编写您的代码,这样您拒绝处理任何文件,直到其最后修改的时间戳至少为 < em>x 分钟前。我想我们定下了 5 分钟。这非常可怕,因为您实际上是在开火、检查、 hibernate 、检查等等。

但是您描述的问题在 FTP 中是众所周知的。就像我说的,我不知道这两种方法中的任何一种是否适用于您的环境,但在较高的水平上它们肯定是合理的。

关于java - Camel 路线在ftp完成之前拾取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13844564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com