メッセージ・スプリッター・パターン

メッセージ・スプリッター・パターンを使用すると、1 つ以上のターゲットで処理するために、大きな XML メッセージを複数の小さなエレメントに分割することができます。

パターンの動作を示す図。

コンテキスト

ある期間に 1 つのアプリケーションの中で累積された情報を、他のアプリケーションと共有したい場合があります。 典型的な例は、一日の累積売上データや、パートナーから受け取る情報更新などです。 データは特定の期間にわたって累積され、1 つの大きなメッセージとして伝送されます。 一日の終わりに 1 つ以上のターゲット・アプリケーションで処理する際、各エレメントを個別に処理する必要があります。

あるいは、配布される必要のある多数のレコードを含む 1 つのメッセージがアプリケーションによって生成される場合があります。例えば、1 つのアプリケーションが参照データを保守して配布するような場合です。

問題

反復処理構造を含む大きなメッセージにより、メモリーが過度に使用され、他のメッセージ処理が影響を受ける結果としてブローカーに障害が発生する可能性があります。 このパターンは、大きなメッセージに含まれる複数のエレメントを、定義済みのルーティング規則に従ってさまざまなターゲットにルーティングするという課題を扱います。

選択についてのガイダンス

多数のビジネス・トランザクションに関する情報を保管し、1 つ以上のターゲット・アプリケーションにこの情報を一括して伝送するようなアプリケーションに対して、このパターンを使用します。 これを使用すると、メモリーを過度に使用せずに大きなメッセージを扱うことができます。

ソース・アプリケーションまたはターゲット・アプリケーションが準リアルタイム・サービス呼び出しを発行/処理できない場合や、業務上の理由で情報の一括処理が必要な場合に、このパターンを使用できます。

ソリューション

ソリューションとして、可変的なメッセージ・ツリーを使用するメッセージ・フローを実装します。これにより、反復するエレメントを処理する際にエレメントを削除できます。 必要に応じて、部分的な構文解析を使って個々のエレメントを構文解析できます。これらのエレメントは処理が完了すると削除されるため、メモリー内のツリーはエレメント数に比例して大きくなることがありません。 エレメントが抽出されるごとに、適切なターゲット・アプリケーションにルーティングされます。

入力メッセージとすべての出力メッセージは単一トランザクションで処理されます。すべての出力メッセージは永続的です。 XML 入力メッセージの読み取りに失敗した場合はトランザクション全体が失敗します。一方、単一のエレメントの処理でエラーが発生した場合は、失敗したエレメントをキューに追加して後で処理することも、トランザクション全体を失敗させることもできます。