18.8.16. メッセージの有効期限の設定
はじめに
送信されたメッセージは、指定期間(ミリ秒単位)後にコンシューマーに配信されない場合にサーバーで期限切れになるように設定できます。Java Messaging Service(JMS)または HornetQ Core API を使用すると、有効期限をメッセージに直接設定できます。以下に例を示します。
// message will expire in 5000ms from now message.setExpiration(System.currentTimeMillis() + 5000);
// 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);
// messages sent by this producer will be retained for 5s (5000ms) before expiration
producer.setTimeToLive(5000);
期限切れアドレスより消費された期限切れメッセージは次のプロパティーを持っています。
- _HQ_ORIG_ADDRESS
期限切れメッセージの元のアドレスが含まれる文字列プロパティー。
- _HQ_ACTUAL_EXPIRY
期限切れメッセージの実際の失効時間が含まれるロングプロパティー。
JMS プロデューサーで time-to-live パラメーターを設定する他に、メッセージごとに設定することもできます。これを行うには、メッセージの送信時にプロデューサーの送信メソッドに TTL パラメーターを追加します。
producer.send(message, DeliveryMode.PERSISTENT, 0, 5000)
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>
<!-- 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 までの値である必要があります。デフォルトは 3 です。