我们正在尝试在 Camel 中构建一个进程服务器。我们有几个客户端,通过FTP提供文件。我们必须镜像ftp文件,但我们只想下载我们还没有的文件。客户端的服务器必须保持原封不动,因此不允许更改,只允许读取。
String to = DownloadFolder.getInstance().getDownloadFolder() + File.separator + "test";
from("ftp://user@server/downloads/&binary=true&stepwise=false&localWorkDirectory=/tmp")//
.process(new ProcessCheckForDownload(to))//
.to("file://" + to + "?keepLastModified=true")//
.to("jms:queue:FTP_FILE_RECEIVED");
问题是,在我检查下载之前,ftp正在下载文件。设置 download=false 时,我将能够检查下载,但如何继续。我无法处理单个文件进行下载,至少现在如此。下一个问题是,这个作业被破坏了,因为 jms 想要获取临时文件,而不是最终文件。
也许有人对如何继续解决这个问题有提示。
该文件以及FTP组件内置了此功能。它被称为幂等消费者。基本上,您可以通过在端点上idempotent=true
来打开此功能。
默认幂等存储库不会在服务器重新启动后继续存在,因为它将有关已读取文件的数据存储在内存中。可以改用持久性幂等存储库,例如基于文件的幂等存储库(或某些数据库存储库或自定义类)。
文件页面上有很多示例,因为FTP组件继承自File,同样的事情(大部分)适用。
顺便说一句,download=false
功能仅适用于尚未发布的 Camel 2.11。
我认为我们必须扩展GenericFileConsumer的方法是ValidFile。
protected boolean isValidFile(GenericFile<T> file, boolean isDirectory) {
if (!isMatched(file, isDirectory)) {
log.trace("File did not match. Will skip this file: {}", file);
return false;
} else if (endpoint.isIdempotent() && endpoint.getIdempotentRepository()**.contains(file.getAbsoluteFilePath())**) {
log.trace("This consumer is idempotent and the file has been consumed before. Will skip this file: {}", file);
return false;
}
// file matched
return true;
}
我们必须生成自己的密钥,其中包含上次更改的大小和日期。我认为这将解决问题。
.contains(file.getAbsoluteFilePath()+":"+file.getFileLength()+":"+file.getLastModified())
我们所要做的就是创建自己的消费者。