9

Karaf内を実行するCamelルートがあり、そのためにDeadLetterChannelを追加しました。これは、ルートが失敗し、問題メッセージを保持して原因をログに記録したい場合を処理するためです。一部の処理を非同期で処理しているため、呼び出し元のアプリケーションに例外をスローすることはできません。

ドキュメントを読んで多くのケースを試してみると、例外をKarafのログに記録する方法と、元のメッセージをデッドレターキューに入れる方法の両方を理解することはできません。

これが私が持っているものの抜粋です:-

<bean id="deadLetterQueue" class="org.apache.camel.builder.DeadLetterChannelBuilder">
    <property name="deadLetterUri" value="activemq:dead.letter.queue"/>
    <property name="redeliveryPolicy" ref="redeliveryPolicy"/>
</bean>

<bean id="redeliveryPolicy" class="org.apache.camel.processor.RedeliveryPolicy">
    <property name="maximumRedeliveries" value="1"/>
    <property name="redeliveryDelay" value="1000"/>
</bean>

<camelContext id="notification" errorHandlerRef="deadLetterQueue"
    trace="false" xmlns="http://camel.apache.org/schema/blueprint">
    <onException>
        <exception>org.xyz.exceptions.unchecked.notificationException</exception>
        <log logName="notifications" loggingLevel="ERROR"
            message="Exception from notification Camel route" />
    </onException>

    <route id="DoSomething" errorHandlerRef="deadLetterQueue">
        <from uri="activemq:notification.in" />
        <log logName="notifications" loggingLevel="TRACE"
            message="Notification route initiated" />
        <bean ref="NotificationProcessor" method="doStuff" />
    </route>
</camelContext>

「onException」構造を削除すると、すべての例外の場合に、ソースメッセージはデッドレターキューに表示されますが、ログに記録されません。

上記のように実行すると、例外トレースはKarafのログに記録されますが(「notificationException」の場合)、関連するソースメッセージはデッドレターキューにロールバックされず、エーテルに消えます(おそらく私が考えているように) 「onException」構造内で処理しました)。

さまざまな種類のエラーハンドラーを調べた後、代わりにDeadLetterChannelBuilderに次のようなものを追加してみました...

<property name="logName" value="notifications"/>
<property name="level" value="ERROR"/>

...しかし、これらは合法的な財産ではありません。

また、onException句にさまざまな例外を明示的にリストする必要があるのは正しくないことにも気づきます。

では、メッセージをキューに入れるだけでなく、例外トレースをログに記録するためにデッドレターチャネルを取得するにはどうすればよいですか?おそらく、デッドレターチャネルは正しいハンドラーではありません-この場合、自動再配信にはあまり興味がありません。

ガイダンスをありがとう、

J。

4

2 に答える 2

7

Camel DSL で表現された、例外をログに記録し、交換をデッド レター キューに送信する別のオプションを次に示します。

Processor exceptionLoggingProcessor = (exchange) -> 
      logger.error("Error handled in camel.", exchange.getProperty(Exchange.EXCEPTION_CAUGHT));

setErrorHandlerBuilder(deadLetterChannel("direct:dlq")
    .onExceptionOccurred(exceptionLoggingProcessor));
于 2016-07-06T14:35:56.867 に答える
6

配信不能キューのルートを使用して、ロギングと JMS キューへの送信を行うことができます。そして、直接を使用してこのルートを参照します

<property name="deadLetterUri" value="direct:myDLC"/>

<route>
  <from uri="direct:myDLC"/>
  <log logName="notifications" loggingLevel="ERROR"
            message="Exception from notification Camel route" />
  <to uri="activemq:dead.letter.queue"/>
</route>

Camel のどのバージョンを使用していますか?

于 2012-12-05T08:14:10.810 に答える