File apachecamel和FTP处理

File apachecamel和FTP处理,file,ftp,download,apache-camel,File,Ftp,Download,Apache Camel,我们正在尝试在Camel中构建流程服务器。我们有几个客户端,通过FTP提供文件。我们必须镜像ftp文件,但我们只想下载尚未下载的文件。客户端的服务器必须保持不变,因此不允许更改,只允许读取 String to = DownloadFolder.getInstance().getDownloadFolder() + File.separator + "test"; from("ftp://user@server/downloads/&binary=true&

我们正在尝试在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组件内置了此功能。这叫一个。基本上,您可以通过端点上的
幂等=true
来启用此功能

默认的幂等式repo在服务器重新启动后无法生存,因为它将有关已读取文件的数据存储在内存中。您可以改用持久幂等元repo,例如(或某些,或您的自定义类)

页面上有很多示例,因为FTP组件继承自文件,同样的情况也适用(大部分情况下)


顺便说一句,
download=false
功能仅适用于尚未发布的Camel 2.11。

我认为我们必须扩展GenericFileConsumer的isValidFile方法

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;
    }

我们所要做的就是创建自己的使用者。

不幸的是,幂等元=true功能实际上只检查文件名。更新文件时,它无法识别这些更改。但这是我们的一个请求。是的,这是一个好主意,允许人们自定义密钥并指定包含时间戳等。我已经记录了一个问题:@ClausIbsen:我尝试将indempotentKey与2.11-SNAPSHOT和sftp方案结合使用,但camel抱怨参数未知。更改是否仅影响文件组件,或者我是否应该能够将indempotentKey与sftp一起使用?我在ASF上记录了JIRA票证以改进这一点:
.contains(file.getAbsoluteFilePath()+":"+file.getFileLength()+":"+file.getLastModified())