第11章 Messaging Endpoint

概要

Messaging Endpoint パターンは、エンドポイントに設定できるさまざまな機能とサービス品質を表しています。

11.1. Messaging Mapper

概要

Messaging Mapper パターンは、ドメインオブジェクトと正規のメッセージ形式とを双方向にマップする方法を説明しています。ここでは、メッセージ形式は可能な限りプラットフォーム非依存なものが選ばれます。選ばれたメッセージ形式は、「Message Bus」 上での送信に適したものである必要があります。メッセージバスは、さまざまなシステムを統合するための基盤であり、統合するシステムの一部はオブジェクト指向ではない場合があります。

多くの異なるアプローチが可能ですが、そのすべてがメッセージングマッパーの要件を満たしている訳ではありません。たとえば、オブジェクトを送信する明らかな方法の 1 つは、 オブジェクトのシリアライズ を使用することです。この方法を使えば、明確なエンコーディング (Java でネイティブにサポートされている) を使用してオブジェクトをデータストリームに書き込むことができます。しかし、これはメッセージングマッパーパターンに使用するのに適した方法では ありません。シリアライズ形式は Java アプリケーションでしか認識できないためです。Java オブジェクトのシリアライズは、元のアプリケーションとメッセージングシステム内の他のアプリケーションとの間でインピーダンスミスマッチを発生させます。

メッセージングマッパーの要件は、以下のように要約できます。

  • ドメインオブジェクトの送信に使用される正規のメッセージ形式は、オブジェクト指向でないアプリケーションでの使用に適したものである必要があります。
  • マッパーのコードは、ドメインオブジェクトのコードからもメッセージングインフラストラクチャーからも分離して実装する必要があります。Apache Camel は、マッパーのコードをルートに挿入するためのフックを提供することで、この要件に対応しています。
  • マッパーは継承、オブジェクト参照、オブジェクトツリーなどのオブジェクト指向の概念を効果的に扱う方法を見つけなければならない場合があります。こうした問題の複雑さはアプリケーションによって異なりますが、マッパー実装の目的は、常に、オブジェクト指向でないアプリケーションが効果的に処理できるメッセージを作成することにあります。

マップすべきオブジェクトの検索

以下のメカニズムのいずれかを使用して、マップするオブジェクトを見つけることができます。

  • 登録された Bean を検索する。 - シングルトンオブジェクトや数の少ないオブジェクトの場合は、CamelContext レジストリーを使用して Bean への参照を格納することができます。たとえば、Bean インスタンスが Spring XML を使用してインスタンス化されている場合、Bean はレジストリーに自動的に登録され、id 属性の値で識別されます。
  • JoSQL 言語を使用してオブジェクトを選択する。 - アクセスするオブジェクトがすべて実行時にすでにインスタンス化されている場合は、JoSQL 言語を使用して特定のオブジェクト (または複数のオブジェクト) を見つけることができます。たとえば、name Bean プロパティーを持つ org.apache.camel.builder.sql.Person クラスがあり、受信メッセージが UserName ヘッダーを持つ場合は、以下のコードを使用して name プロパティーの値が UserName ヘッダーの値に等しいオブジェクトを選択できます。

    import static org.apache.camel.builder.sql.SqlBuilder.sql;
    import org.apache.camel.Expression;
    ...
    Expression expression = sql("SELECT * FROM org.apache.camel.builder.sql.Person where name = :UserName");
    Object value = expression.evaluate(exchange);

    構文 :HeaderName は、JSQL 式のヘッダーの値を置き換えるために使用されます。

  • 動的 - よりスケーラブルなソリューションを必要とする場合には、データベースからオブジェクトデータを読み取る必要がある可能性があります。場合によっては、既存のオブジェクト指向アプリケーションがすでにデータベースからオブジェクトをロードできるファインダーオブジェクトを提供していることがあります。そうでない場合、データベースからオブジェクトを抽出するカスタムコードを書く必要がある可能性があります。その場合には、JDBC コンポーネントと SQL コンポーネントが役に立つことがあります。