1

特定の読み取り専用ディレクトリからすべてのファイルを読み取って処理するために、ポーリング コンシューマー パターンを使用しています。べき等性を無視するオプションはありますか?

noop=true & idempotent=false で定義されたルートがシステム全体をクラッシュさせる (無限ループ) ことは理解していますが、プーリング コンシューマー パターンは特定の瞬間にトリガーされる 1 回限りの操作です。

4

2 に答える 2

3

camel file2 エンドポイントは、デフォルトで毎秒 2 回ポーリングするため、システムをクラッシュさせません。その時点でそのフォルダーにあるすべてのファイルからメッセージを作成します。(まあ、最近変更されたファイルを無視するオプションがいくつかありますが、それらのほとんどは)。たとえば、ファイルはパイプラインで毎秒 2 回送信されます。

基本的にファイルを入力フォルダーに残すために「noop」が渡されない限り、べき等性はデフォルトでオフになっています。ただし、エンドポイントがポーリングするたびに、すべてのファイルがパイプを通過します。私は通常、処理後 (複数のコンシューマーがいる場合は preMove の前) にファイルを移動して、これらの重複を回避し、冪等ストレージの複雑さを回避します。

noop が選択されている場合、べき等フラグを無効にする方法はありません。

    FileConsumer result = newFileConsumer(processor, operations);

    if (isDelete() && getMove() != null) {
        throw new IllegalArgumentException("You cannot set both delete=true and move options");
    }

    // if noop=true then idempotent should also be configured
    if (isNoop() && !isIdempotentSet()) {
        log.info("Endpoint is configured with noop=true so forcing endpoint to be idempotent as well");
        setIdempotent(true);
    }

その場合、消費者が作成された後、べき等フラグがリセットされます。

できることは、すべての更新を無視する IdempotentRepository ( http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/spi/IdempotentRepository.html ) の簡単な実装を作成することです。エンドポイントに、このファイルを以前に見たことがないことを伝えます。

    package com.company;

    import org.apache.camel.spi.IdempotentRepository;

    public class DummyIdempotentRepository implements IdempotentRepository {
        @Override
        public boolean add(Object key) {
            return true;
        }

        @Override
        public boolean contains(Object key) {
            return false;
        }

        @Override
        public boolean remove(Object key) {
            return true;
        }

        @Override
        public boolean confirm(Object key) {
            return true;
        }

        @Override
        public void start() throws Exception {

        }

        @Override
        public void stop() throws Exception {

        }
    }

このような何かがそれを行う必要があります。

于 2015-05-20T14:59:56.567 に答える
0

特定のイベントでファイルを読み取りたい場合pollEnrichは、ファイル コンシューマを使用します。

from("direct:readFile")
    .setHeader("CamelFileName", simple("${body}"))
    .pollEnrich("file:///base/folder?fileName=${body}&noop=true", 500)
    .process(...)
于 2015-05-20T15:45:29.487 に答える