22.6. 複数のキューを持つアドレスの注意

メッセージが、バインドされた複数のキューを持つアドレスにルーティングされた場合 (たとえば、JMS サブスクリプション) は、メモリー内にメッセージのコピーが 1 つしかありません。各キューはこれに対する参照のみを扱います。つまり、メッセージを参照するすべてのキューがそのメッセージを配信すると、初めてメモリーが解放されます。
例:
  • アドレスが 10 個のキューを持ちます。
  • キューの 1 つがメッセージを配信しません (おそらく、低速なコンシューマーが原因)。
  • メッセージは、連続してアドレスに到着し、ページングが開始されます。
  • メッセージが送信された場合であっても他の 9 個のキューは空になります。
この例では、プロセスがページング解除し、他のキューが最終的にいくつかのメッセージを受け取る前にいくつかのメッセージを最後のキューが配信するまでプロセスは待機する必要があります。

重要

メッセージセレクターは、メモリー内のメッセージに対してのみ動作します。大量のメッセージをディスクにページングし、ページングされる一部のメッセージのみに一致するセレクターがある場合、これらのメッセージは、メモリー内のメッセージが消費されるまで消費されません。
HornetQ は、一致するメッセージを見つけるためにディスク上のページファイルをスキャンしません。これはメッセージングシステムの主な役割ではありません。セレクターを使用して非常に大きいキューでメッセージの小さいサブセットを選択する実装には、リレーショナルデータベースが推奨されます。これは、この機能がリレーショナルデータベースのテーブルに対してクエリーを実行することに似ているためです。

重要

page-size-bytes (サーバー) を ack-batch-size (クライアント) よりも小さい値に設定しないでください。設定すると、システムがハングしているように見えることがあります。
メッセージは、サーバーで識別されるまでサーバーメモリーに残るため、特定のアドレスのメッセージサイズに影響を与えます。
アドレスに対するメッセージがディスクにページングされ、消費される場合、メッセージが消費および承認された後にこのアドレスで十分なメモリーが解放されたときに、これらのメッセージはディスクからページング解除されます。ただし、メッセージが承認されない場合は、メモリー内に空き領域がないため、追加のメッセージはページング解除されません。この場合は、メッセージ消費がハングしているように見えることがあります。
メッセージが明示的に承認されない場合、メッセージは、クライアントの "ack-batch-size" 設定に基づいて承認されます。