286.5.5. トランザクションバッチコンシューマーとプロデューサー
SJMS2 コンポーネントは、Producer エンドポイントと Consumer エンドポイントの両方でローカル JMS トランザクションのバッチをサポートするように設計されています。ただし、それぞれでどのように処理されるかは非常に異なります。
SJMS2 コンシューマーエンドポイントは、関連付けられたセッションでコミットする前に X メッセージを処理する簡単な実装です。コンシューマーでバッチ処理トランザクションを有効にするには、最初に transacted パラメーターを true に設定し、transactionBatchCount を追加して 0 を超える値に設定します。たとえば、以下の設定では 10 個のメッセージごとにセッションをコミットします。
sjms2:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10
コンシューマーエンドポイントでバッチの処理中に例外が発生すると、セッションロールバックが呼び出され、次の利用可能なコンシューマーにメッセージが再配信されます。また、カウンターは、関連付けられたセッションの BatchTransactionCommitStrategy に対して 0 にリセットされます。JMSRedelivered ヘッダーが true に設定されたメッセージを監視するように、バッチメッセージのプロセッサーにフックを配置することはユーザーの責任です。これは、ある時点でメッセージがロールバックされ、正常な処理が行われたことを示すインジケーターです。
トランザクションバッチコンシューマーは、セッション上でオープントランザクションをコミットする前に、メッセージ間でデフォルトの時間(5000 ミリ秒)を待機する内部タイマーのインスタンスも行います。デフォルト値の 5000ms(最低 1000ms)は、ほとんどのユースケースで十分ですが、さらにチューニングが必要な場合は、transactionBatchTimeout パラメーターを設定するだけで十分です。
sjms2:queue:transacted.batch.consumer?transacted=true&transactionBatchCount=10&transactionBatchTimeout=2000
コンテキストスイッチの量によりパフォーマンスに不必要な影響を及ぼすため、許可される最小値は 1000 ミリ秒です。
プロデューサーエンドポイントは処理されますが、異なる方法になります。各メッセージが宛先に配信された後にプロデューサーを使用すると、Exchange が閉じられ、そのメッセージへの参照がなくなりました。再配信ですべてのメッセージを利用可能にするには、BatchMessages を公開するプロデューサーエンドポイントでトランザクションを有効にするだけです。トランザクションは、バッチリスト内のすべてのメッセージが含まれるエクスチェンジの終了時にコミットされます。追加で設定する必要はありません。以下に例を示します。
List<BatchMessage<String>> messages = new ArrayList<BatchMessage<String>>();
for (int i = 1; i <= messageCount; i++) {
String body = "Hello World " + i;
BatchMessage<String> message = new BatchMessage<String>(body, null);
messages.add(message);
}
トランザクションを有効にして List を公開します。
template.sendBody("sjms2:queue:batch.queue?transacted=true", messages);