8

camel コンテキストのすべてのルートによってスローされたすべての例外の例外ハンドラーを構成しようとしています。私のアプローチは次のとおりですが、運はありません。

  1. デフォルトのキャメル コンテキストをインスタンス化する
  2. スプリング コンテキストから RouteDefinition のリストを取得する
  3. ctx.addRouteDefinitions() を呼び出して、これらの定義をキャメル コンテキストに追加します。
  4. RotueBuilder (ctx.addRoutes(new MyErrorHandlerRouteBuilder())) で定義された Java DSL から例外ハンドラ ルートを追加します。
  5. キャメル コンテキストを開始する

この時点で、春に定義されたルート内でスローされた例外は、定義しようとしているものではなく、DefaultErrorHandler によって処理されます。私のエラー処理ルート定義は次のようになります

public class MyErrorHandlerRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
    onException(Exception.class)
        .routeId("errorHandlerRoute")
        .handled(true)
        .process(new Processor() {

            @Override
            public void process(Exchange exchange) throws Exception {
                Throwable caused = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);
                // do some custom processing of the exception
            }
        })
        .stop();
}  

他に何を試すことができますか、またはどこが間違っていますか?

4

4 に答える 4

6

抽象基本クラスを作成し、configureメソッドでグローバルエラーハンドラーを定義します。次に、ルートクラスでこの基本クラスを拡張し、configureメソッドで最初にsuper.configure()を呼び出します。

于 2013-02-15T07:11:31.783 に答える
4

将来の読者のために、これはキャメルエラー処理に使用するソリューションです (これはすべて Java 構成ですが、Spring xml として機能します)。

1) DeadLetterChannelBuilderBeanをセットアップする

@Bean
public DeadLetterChannelBuilder myErrorHandler() {
    DeadLetterChannelBuilder deadLetterChannelBuilder = new DeadLetterChannelBuilder();
    deadLetterChannelBuilder.setDeadLetterUri("direct:error");
    deadLetterChannelBuilder.setRedeliveryPolicy(new RedeliveryPolicy().disableRedelivery());
    deadLetterChannelBuilder.useOriginalMessage();
    return deadLetterChannelBuilder;
}

これで、この Bean がエラーを検出してdirect:errorURI に送信する責任を負います。

2) エラー処理ルートを設定する

direct:errorこれはエラーが現在ルーティングされている場所であるため、URI でリッスンするルートが必要になります。

@Override
public void configure() throws Exception {
    from("direct:error")
            .to("log:error")
            .end();
}

すべてのエラーが上記のルートにルーティングされていることがわかるように、複雑なエラー処理ロジックをグローバルに実装する柔軟性があります。

3) グローバル エラー ハンドラをルートに挿入する

エラー処理 Bean を各ルートに挿入する必要があります。camel がこれを自動的に処理してくれることを望みますが、方法が見つかりません。このアプローチでは、コードの重複/オーバーヘッドは最小限に抑えられます。

@Override
public void configure() throws Exception {
    errorHandler(myErrorHandler)
    from("myStartingUri")
            .to("myEndDestination")
            .end();
}

<route errorHandlerRef="myErrorHandler">springs xml based config のドキュメントを見ると、ルート定義を入れる必要があると思います。

于 2016-02-24T21:38:26.440 に答える
1

エラー ハンドラーは、Java DSL に固有のルート ビルダーです。ルート ビルダーごとに 1 つ作成する必要があります。または、あなたの場合、Spring DSL で定義する必要があります (Spring でルートを定義しているようです)。

于 2013-02-14T23:13:52.087 に答える