第306章 Simple JMS Batch コンポーネント
Camel バージョン 2.16 以降で利用可能
SJMS Batch は、JMS キューから高パフォーマンスのトランザクションバッチを消費するための特殊なコンポーネントです。これは、コンシューマー専用コンポーネントとアグリゲーターのハイブリッドと考えることができます。
Camel の一般的な使用例は、キューからのメッセージを消費し、集約された状態を別のエンドポイントに送信する前にそれらを一本化することです。処理を実行しているシステムに障害が発生した場合にデータが失われないようにするために、データは通常、トランザクション内でキューから消費され、JDBC Component にあるような永続的な AggregationRepository
に集約されて格納されます。
アグリゲーターパターンの動作には、受信メッセージが集約される前に AggregationRepository
からデータをフェッチし、その後結果を書き戻すことが含まれます。本質的に、集約されたアーティファクトの数が増えるにつれて、読み取りと書き込みにかかる時間が徐々に長くなります。これの影響を示す任意の時間単位を使用した大まかな例は次のとおりです。
項目 | 読み取り時間 | 書き込み時間 | 合計時間 |
---|---|---|---|
0 | 0 | 1 | 1 |
1 | 1 | 2 | 4 |
2 | 2 | 3 | 9 |
3 | 3 | 4 | 16 |
4 | 4 | 5 | 25 |
5 | 5 | 6 | 36 |
6 | 6 | 7 | 49 |
7 | 7 | 8 | 64 |
8 | 8 | 9 | 81 |
9 | 9 | 10 | 100 |
対照的に、SJMS Batch コンポーネントを使用した消費パフォーマンスは直線的です。各メッセージは、次のメッセージがフェッチされる前に AggregationStrategy
を使用して消費および集約されます。すべての消費と集約が単一の JMS トランザクションで実行されるため、中間状態を維持するために外部ストレージは必要ありません。これにより、上記の読み取りと書き込みのコストが回避されます。実際には、これにより数桁高いスループットが得られます。
最初のメッセージからのサイズまたは期間によって完了条件が満たされると、集約された Exchange
がルートに渡されます。この Exchange
の処理中に例外が出力されるか、システムがシャットダウンすると、元の消費されたすべてのメッセージが最終的にキューに戻されます (または、ブローカーの設定に応じて配信不能キューに配置されます)。
通常のアグリゲーターを使用する場合とは異なり、集約条件の機能はありません。つまり、メッセージを複数のグループにまとめて消費することはできません。消費されたすべてのメッセージは、1 つのバッチにまとめられます。
複数の JMS コンシューマーサポートが利用可能です。これにより、1 つのルートを使用して並行して消費し、同時に JMS メッセージグループなどの機能を使用して関連するメッセージをグループ化できます。
Maven ユーザーは、このコンポーネントの pom.xml
に以下の依存関係を追加する必要があります。
<dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-sjms</artifactId> <version>x.x.x</version> <!-- use the same version as your Camel core version --> </dependency>
306.1. URI 形式
sjms:[queue:]destinationName[?options]
ここで、destinationName
は JMS キューです。デフォルトでは、destinationName
はキュー名として解釈されます。
sjms:FOO.BAR
必要に応じて、オプションの queue:
接頭辞を含めることができます。
sjms:queue:FOO.BAR
そのコンテキスト内でバッチ消費を使用する利点がないため、トピック消費はサポートされていません。トピックメッセージは通常非永続的であり、損失は許容されます。失敗したトランザクション内で消費された場合、トピックメッセージはブローカーによって再配信されない可能性があります。このシナリオでは、プレーンな SJMS コンシューマーエンドポイントを通常の非永続性に基づくアグリゲータと組み合わせて使用できます。