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 を設定すると、ダウンロードを確認できますが、次に進む方法。少なくとも今のところ、ダウンロード用のファイルを 1 つも処理できません。次の問題は、jms が最終ファイルではなく一時ファイルを取得したいため、このジョブが壊れていることです。

おそらく、この問題をどのように進めるかについてのヒントを誰かが持っているでしょう。

4

2 に答える 2

1

ファイル、したがってFTPコンポーネントには、この機能が組み込まれています。これは、べき等コンシューマーと呼ばれます。基本的にidempotent=true、エンドポイントでこの機能をオンにすることができます。

デフォルトのべき等リポジトリは、すでに読み取られたファイルに関するデータをメモリに保存するため、サーバーの再起動後も存続しません。代わりに、ファイルベースのべき等リポジトリ(または一部のデータベースリポジトリ、またはカスタムクラス)などの永続的なべき等リポジトリを使用できます。

FTPコンポーネントはFileから継承するため、ファイルページには多くの例があります。同じことが(ほとんど)当てはまります。

ところで、このdownload=false機能はまだリリースされていないCamel2.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 に答える