第34章 メッセージ形式について
概要
Apache Camel でプログラミングを開始する前に、メッセージとメッセージ交換をモデル化する方法を明確に理解する必要があります。Apache Camel は多くのメッセージ形式を処理できるため、基本メッセージタイプは抽象形式を持つように設計されています。Apache Camel は、メッセージボディーおよびメッセージヘッダーのデータフォーマットにアクセスして変換するために必要な API を提供します。
34.1. エクスチェンジ
概要
エクスチェンジオブジェクト は、受信したメッセージをカプセル化し、関連するメタデータ (交換プロパティーを含む) を格納するラッパーです。さらに、現在のメッセージがプロデューサーエンドポイントにディスパッチされると、エクスチェンジは応答 (Out メッセージ) を保持する一時的なスロットを提供します。
Apache Camel でのエクスチェンジの重要な機能は、メッセージの Lazy Creation をサポートすることです。これにより、メッセージへの明示的なアクセスを必要としないルートの場合、大幅に最適化される可能性があります。
図34.1 ルート経由のエクスチェンジオブジェクト
図34.1「ルート経由のエクスチェンジオブジェクト」 は、ルートを通過するエクスチェンジオブジェクトを表示します。ルートのコンテキストでは、エクスチェンジオブジェクトは Processor.process()
メソッドの引数として渡されます。つまり、エクスチェンジオブジェクトはソースエンドポイント、ターゲットエンドポイント、および間のすべてのプロセッサーから直接アクセスすることができます。
Exchange インターフェイス
org.apache.camel.Exchange インターフェースでは、例34.1「エクスチェンジメソッド」 で示されるように、In および Out メッセージにアクセスするためのメソッドを定義します。
例34.1 エクスチェンジメソッド
// Access the In message Message getIn(); void setIn(Message in); // Access the Out message (if any) Message getOut(); void setOut(Message out); boolean hasOut(); // Access the exchange ID String getExchangeId(); void setExchangeId(String id);
エクスチェンジインターフェースのメソッドの詳細は、「Exchange インターフェイス」 を参照してください。
メッセージの Lazy Creation
Apache Camel は、In、Out、および Fault のそれぞれのメッセージで Lazy Creation をサポートします。これは、メッセージインスタンスはアクセスを試みるまで作成されないことを意味します (例: getIn()
または getOut()
)。遅延メッセージ作成のセマンティクスは、org.apache.camel.impl.DefaultExchange
クラスによって実装されています。
無引数のアクセッサー (getIn()
または getOut()
) のいずれかを呼び出す場合や、ブール値の引数 true
を持つアクセッサー (getIn(true)
または getOut(true)
) を呼び出す場合は、メッセージインスタンスがまだ存在しない場合にはデフォルトのメソッド実装によって新たに作成されます。
ブール値の引数を持つアクセサーを false
(getIn(false)
または getOut(false)
) と等しい場合、デフォルトのメソッド実装は現在のメッセージ値を返します。[1]
エクスチェンジ ID の Lazy Creation
Apache Camel は、エクスチェンジ ID の Lazy Creation をサポートします。エクスチェンジで getExchangeId()
を呼び出し、そのエクスチェンジインスタンスの一意の ID を取得することができますが、この ID はメソッドを実際に呼び出す場合にのみ生成されます。このメソッドの DefaultExchange.getExchangeId()
の実装では、ID 生成を CamelContext
で登録された UUID ジェネレーターに委任します。
CamelContext
で UUID ジェネレーターを登録する方法の詳細は、「ビルトイン UUID ジェネレーター」 を参照してください。