Apache Camel and FTP processing



我们正在尝试在 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())

我们所要做的就是创建自己的消费者。

相关内容

  • 没有找到相关文章

最新更新