以下の内容はhttps://rheb.hatenablog.com/entry/cac20251210より取得しました。


Camel による Exception/Error Handling

Apache Camel Advent Calendar 10日目の記事は、サポート担当古市が担当します。 テーマは、「Camel による Exception/Error Handling」

基本的な使い方と componentの調べ方/試し方がわかった次に気になるのは、例外処理ではないでしょうか。 Camel を使う上で知っておくべき例外処理は、3つあります。

  • ErrorHandler
  • OnException
  • DoTry/DoCatch

コミュニティードキュメントに、詳細解説があります。

camel.apache.org

camel.apache.org

camel.apache.org

camel.apache.org

Camelユーザーにとってバイブルと言える書籍「Camel in Action 2nd」では例外処理について網羅的に解説されており、とてもわかりやすいです。

www.manning.com

より深く Camelについて学びたい方にはお勧めの書籍ではありますが、まずはざっくりと確認されたい方には、以前、Japan Camel User Groupで読書会を開催した際のまとめ資料があります。 フェンさんのまとめ資料(日本語)が素晴らしいので、こちらをご確認ください。

www.slideshare.net

www.slideshare.net

www.slideshare.net

まずは Exception/Error Handling の挙動を確認するための簡単な camel route を作成し、動かしながら動作を理解するのをお勧めします。

hfuruich@hfuruich-mac camel % cat Hello.java 
import org.apache.camel.builder.RouteBuilder;
import java.io.IOException;

public class Hello extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("timer:java?period=1000")
            .setBody()
                .simple("Hello Camel from ${routeId}")
        .process(e -> { throw new IOException("Simulated Exception"); })
            .log("${body}");
    }
}

doTry/DoCatch, OnException, ErrorHandler の使い分けについて、Geminiへアドバイスを求めてみました。ご参考までに。

errorHandler は、ルートやシステム全体で一貫したフォールトトレランス戦略(「失敗したらリトライし、ダメなら隔離する」など)を定義するために使用します。個別のビジネスロジックではなく、アプリケーション全体の信頼性に関わる設定と考えるのが適切です。

onException は、errorHandler よりも具体的で、特定の例外クラスに対して個別の処理ルールを定義します。errorHandler の設定を上書きする形で動作します。
「SQLException が発生した場合はリトライし、管理者にメールを送信する」「ValidationException が発生した場合は、エラーメッセージをボディに設定して正常終了させる」といった、特定の業務エラーに応じた詳細なハンドリングを行いたい場合に使用します。

doTry/doCatchは、「外部 API を呼び出す部分で、もし接続に失敗したら、代わりにデフォルトの値を返す」「特定のデータ変換処理でエラーが起きたら、その部分だけスキップして処理を続ける」といった、ルート全体の流れを止めずに、部分的な失敗をその場で回復・代替処理したい場合に最適です。

 結論

これらの3つのメカニズムは競合するものではなく、レイヤー(層)のように組み合わせて使用するのがベストプラクティスです。

1: まず、errorHandler (特に DeadLetterChannel) でアプリケーション全体の基本的な信頼性を確保します。
2: 次に、ビジネス要件に応じて**onException** を使い、特定の例外に対する共通の処理ルールを追加します。
3: そして、ルート内の個別の処理ステップで発生しうる局所的なエラーは doTry/doCatch で柔軟にハンドリングします。

このように役割分担させることで、Camel ルートは非常に堅牢で、メンテナンス性の高いものになります。

明日の advent calendar 11日目では、「Camel SEDA エンドポイント」についてご紹介します。 アドベントカレンダーの一覧はこちらです。 qiita.com




以上の内容はhttps://rheb.hatenablog.com/entry/cac20251210より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14