0

我们正在尝试在 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 想要获取临时文件,而不是最终文件。

也许有人对如何解决这个问题有提示。

4

2 回答 2

1

该文件以及 FTP 组件都内置了此功能。它被称为幂等消费者idempotent=true基本上,您可以通过在端点上打开此功能。

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

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

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

于 2013-01-22T18:09:40.817 回答
0

我认为我们必须扩展 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;
    }

我们必须生成我们自己的包含大小和上次更改日期的密钥。我认为这会奏效。

.contains(file.getAbsoluteFilePath()+":"+file.getFileLength()+":"+file.getLastModified())

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

于 2013-01-23T08:42:38.757 回答