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

基本的な使い方と componentの調べ方/試し方がわかった次に気になるのは、例外処理ではないでしょうか。 Camel を使う上で知っておくべき例外処理は、3つあります。
- ErrorHandler
- OnException
- DoTry/DoCatch
コミュニティードキュメントに、詳細解説があります。
Camelユーザーにとってバイブルと言える書籍「Camel in Action 2nd」では例外処理について網羅的に解説されており、とてもわかりやすいです。
より深く Camelについて学びたい方にはお勧めの書籍ではありますが、まずはざっくりと確認されたい方には、以前、Japan Camel User Groupで読書会を開催した際のまとめ資料があります。 フェンさんのまとめ資料(日本語)が素晴らしいので、こちらをご確認ください。
まずは 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