7.3. 非同期の受信

7.3.1. 非同期メッセージ取得(Prefetch)

デフォルトでは、受信側は fetch() 呼び出しの応答として単一のメッセージを同期的に取得します。メッセージ のプレフェッチを行うレシーバーの容量はデフォルトで 0 です。
レシーバーの容量が 0 を超える値に設定されていると、受信側はキューからその数のメッセージに非同期的に取得します。この非同期の取得は prefetch と呼ばれ、レシーバーの capacity プロパティーを設定して有効および制御されます。
メッセージの事前フェッチには、以下の 2 つの利点があります。
  • 事前にフェッチされたメッセージは、アプリケーションによって要求された場合にローカルで利用できます。ただし、ブローカーからメッセージを取得する同期呼び出しのオーバーヘッドはありません。
  • prefetching が有効になっているレシーバーには、事前フェッチされたメッセージが利用可能数を判断するために呼び出される available() メソッドがあります。
available() メソッドには、以下の 2 つの点に注意してください。
prefetching は非同期です。つまり、キューの状態の絶対インジケータ available() として呼び出しによって返される数字に依存することはできません。たとえば、受信側の available() キャパシティーを 0 以外の値に設定したら、利用できる値が 0 のメッセージを返す可能性があります。これは、キューに必ずしもメッセージがないことを意味しますが、事前にフェッチされたメッセージはまだローカルで利用可能ではないことを意味します。
また、プレフェッチが有効なレシーバーの available メソッドによって報告される最大値は、capacity 受信側になります。この available() メソッドは、キュー内のメッセージの数ではなく、利用可能な事前フェッチされたメッセージの数を報告します。利用可能なメッセージの数がレシーバーの容量よりも小さい場合は、プレフェッチの非同期性質について、上記のメッセージと共にキュー内のメッセージ数であることを推測することができます。