2

DeadLetterChannelだから、私はコンテキストレベルで再配信のないラクダのコンテキストを持っています。コンテキスト内に私はルートを持っています:

from("direct:input")
     .routeId("enrichHeader")
     .setHeader("myHeader").constant("someValue)
     .to("direct:output");

ユニットテストがinterceptSendToEndpoint("direct:output")あり、例外がスローされます。

次に、単体テストで行いますproducerTemplate.sendBody(theBody)

これで、上記の例外で構成されたように、メッセージはデッドレターチャネルに送信されます。すべて順調です。ただし、設定するloggingErrorHandlerと奇妙な動作になります。したがって、上記のルートを次のように更新すると、次のようになります。

from("direct:input")
     .routeId("enrichHeader")

     .errorHandler(
        loggingErrorHandler("com.myco.myproject")
             .level(LoggingLevel.WARN))

     .setHeader("myHeader").constant("someValue)
     .to("direct:output");

テストを実行すると、2つの予期しない動作が発生します。ERRORまず、例外は構成済みではなくレベルでログに記録されますWARN。次に、例外が呼び出しに伝播されproducerTemplate.sendBody(theBody)ます。

一方では、でのロギングERRORは明らかに奇妙です。奇妙に思われる他の部分は、ハンドラーが例外を伝播していることです。私はそれが処理済みとしてマークされ、それで完了したと思っていたでしょう。

これは予想される動作ですか?のドキュメントLoggingErrorHandlerが不足しているようです。

4

1 に答える 1

5

LoggingErrorHandler例外をログに記録するだけです。例外をスキップする場合は、次のようにポリシーを定義する必要があります

onException(com.myco.myproject.MyException.class).continued(true);

または、JavaのブロックとdoTry()..doCatch()同じように使用する必要があります。try{...} catch{...}

例えば:

    from("direct:input").routeId("enrichHeader")
    .doTry()
        .setHeader("myHeader").constant("someValue)
        .to("direct:output")
    .doCatch(MyException.class)
        .process(new MYExceptionLoggerAndHandler())
   .end();
于 2013-03-20T00:15:03.403 に答える