20.8.11. メッセージの有効期限の設定

はじめに

送信されたメッセージが指定期間 (ミリ秒単位) 後にコンシューマーへ配達されなかった場合、サーバー側で期限切れになるように設定できます。Java Messaging Service (JMS) または HornetQ Core API を使用して、期限切れの時間を直接メッセージに設定できます。例は次のとおりです。

// message will expire in 5000ms from now
message.setExpiration(System.currentTimeMillis() + 5000);
JMS MessageProducer には送信するメッセージの有効期限を制御する TimeToLive パラメーターが含まれています。
// messages sent by this producer will be retained for 5s (5000ms) before expiration           
producer.setTimeToLive(5000);
期限切れアドレスより消費された期限切れメッセージは次のプロパティーを持っています。
  • _HQ_ORIG_ADDRESS
期限切れメッセージの元のアドレスが含まれる文字列プロパティー。
  • _HQ_ACTUAL_EXPIRY
期限切れメッセージの実際の失効時間が含まれるロングプロパティー。
Time-To-Live パラメーターは、JMS プロデューサーで設定する以外に、メッセージごとに設定することもでます。これは、メッセージの送信時にプロデューサーの送信メソッドに TTL パラメーターを追加することにより実現できます。
producer.send(message, DeliveryMode.PERSISTENT, 0, 5000)
ここで、最後のパラメーターはメッセージ固有の TTL です。
期限切れアドレスの設定

期限切れアドレスは address-setting 設定で定義されます。

<!-- expired messages in exampleQueue will be sent to the expiry address expiryQueue -->
<address-setting match="jms.queue.exampleQueue">
   <expiry-address>jms.queue.expiryQueue</expiry-address>
</address-setting>
メッセージの期限が切れ、期限切れアドレスが指定されていない場合、メッセージはキューから削除されドロップされます。
期限切れリーパー (Reaper) スレッドの設定

リーパー (reaper) スレッドは、メッセージの期限切れを検証するためにキューを定期的に検査します。

  • message-expiry-scan-period
期限切れメッセージを検出するためにキューがスキャンされる頻度 (ミリ秒単位でデフォルト値は 30000 ミリ秒)。-1 を設定するとリーパースレッドが無効になります。
  • message-expiry-thread-priority
リーパースレッドの優先度。値は 0 から 9 までの数字を指定する必要があり、最も優先度が高いのは 9 になります。デフォルト値は 3 です。