web-dev-qa-db-ja.com

Apache Camelを使用してファイルの変更を監視するにはどうすればよいですか?

特定のディレクトリ内のすべてのファイルの変更、つまり更新されたタイムスタンプを監視したいと思います。このユースケースは、ファイルコンポーネントを使用するCamelにとって自然なようですが、この動作を構成する方法が見つからないようです。

のようなウリ:

file:/some/directory

指定されたディレクトリ内のファイルを消費しますが、それらを削除します。

のようなウリ:

file:/some/directory?noop=true

ファイルが追加されたとき、またはルートが開始されたときに、各ファイルを1回消費します。

の線に沿ってオプションがないことは驚くべきことです

consumeOnChange=true

ファイルの変更を監視し、消費後にファイルを削除しない簡単な方法はありますか?

16
Janx

これを行うには、idempotentKeyを設定して、ファイルが変更されたと見なされる方法をCamelに通知します。たとえば、ファイルサイズが変更されたり、タイムスタンプが変更されたりした場合などです。

詳細については、次のCamelファイルのドキュメントを参照してください。 http://camel.Apache.org/file2

セクション同じファイルを複数回読み取ることの回避(べき等の消費者)を参照してください。そして、べき等とべき等について読んでください。

だから何か似ている

from("file:/somedir?noop=true&idempotentKey=${file:name}-${file:size}")

または

from("file:/somedir?noop=true&idempotentKey=${file:name}-${file:modified}")

使用できるさまざまな$ {file:xxx}トークンについてここで読むことができます: http://camel.Apache.org/file-language.html

20
Claus Ibsen

Camelがその特定の機能をサポートしているとは思いませんが、既存のオプションを使用すると、ディレクトリを監視する同様のソリューションを思い付くことができます。

あなたがする必要があるのは、ディレクトリをチェックし、すでに読み取られたファイルのリポジトリを維持するために小さな遅延値を設定することです。リポジトリの構成方法(サイズ、ファイル名、それらの組み合わせなど)に応じて、このソリューションはニュースファイルと変更されたファイルに関する情報を提供できます。警告として、ディレクトリ内のファイルを頻繁に消費することになります。

たぶん、Apache Commons VFS2のようなCamelとは異なる他のソリューションを使用できます(このシナリオでの使用方法についての説明を書きました: WatchServiceはいくつかのファイルをロックしますか?

1
hveiga

nooptrueに設定すると、ラクダの設定idempotent = true同様に、べき等はデフォルトでfalseであるという事実にもかかわらず。

ファイルを監視する最も簡単な解決策は次のとおりです。

.from("file:path?noop=true&idempotent=false&delay=60s")

これにより、指定されたディレクトリ内のすべてのファイルへの変更が1分ごとに監視されます。

これは、Camelのドキュメント( http://camel.Apache.org/file2.html )にあります。

1
Piotr Niewinski

私は同じ問題に直面しました。つまり、更新されたファイルも(新しいファイルと一緒に)コピーしたかったのです。以下は私の構成です、

public static void main(String[] a) throws Exception {

    CamelContext cc = new DefaultCamelContext();

    cc.addRoutes(createRouteBuilder());

    cc.start();

    Thread.sleep(10 * 60 * 1000);

    cc.stop();
}


protected static RouteBuilder createRouteBuilder() {
    return new RouteBuilder() {
        public void configure() {
            from("file://D:/Production"
                    + "?idempotent=true"
                    + "&idempotentKey=${file:name}-${file:size}"
                    + "&include=.*.log"
                    + "&noop=true"
                    + "&readLock=changed")

            .to("file://D:/LogRepository");
        }
    };
}

私のテスト手順:

  1. プログラムを実行すると、いくつかの.logファイルがD:/ ProductionからD:/ LogRepositoryにコピーされ、D:/ Productionディレクトリのポーリングが続行されます。
  2. D:/ ProductionからA.logなどのコピー済みのログを開き(noop = trueなので何も移動されないため)、エディターツールで編集しました。これにより、ファイルサイズが2倍になり、保存されます。

この時点で、Camelはサイズが変更されているため、その特定のファイルを再度コピーすることになっていると思います。ルート定義では、「idempotent = true&idempotentKey = $ {file:name}-$ {file:size}&readLock =変更 "。しかし、ラクダはファイルを無視します。ロギングにTRACEを使用すると、「ファイルとしてスキップしています...」と表示されますが、ファイルを編集して保存したときに、D:/ Productionディレクトリにロックファイルが見つかりませんでした。

また、外部からD:/ ProductionディレクトリのA.log(同じ名前でサイズが大きい)を置き換えても、ラクダがファイルを無視することを確認しました。

しかし、私は、noop = trueオプションを削除するとすべてが期待どおりに機能しているであることがわかりました。

私は何かが足りないのですか?

1

キャメルでファイルの変更を監視する場合は、ファイル監視コンポーネントを使用します。

例->すべてのイベントを再帰的に監視(ファイルの作成、ファイルの削除、ファイルの変更):

from("file-watch://some-directory")
.log("File event: ${header.CamelFileEventType} occurred on file ${header.CamelFileName} at ${header.CamelFileLastModified}");

ここで完全なドキュメントを見ることができます: Camelファイルウォッチコンポーネント

0
Amin Moradi