第16章 メッセージ有効期限の設定
送信されたメッセージが指定された期間後にコンシューマーに配信されない場合に、そのメッセージがサーバーで期限切れになるように設定できます。これらの期限切れのメッセージは、さらに調査をするために後で使用できます。
コア API を使用したメッセージ有効期限の設定
コア API を使用すると、setExpiration
メソッドを使用してメッセージの有効期限を設定できます。
// The message will expire 5 seconds from now message.setExpiration(System.currentTimeMillis() + 5000);
JMS を使用したメッセージ有効期限の設定
メッセージの送信時に、JMS MessageProducer
が使用する持続時間を設定できます。この値は、setTimeToLive
メソッドを使用してミリ秒単位で指定します。
// Messages sent by this producer will be retained for 5 seconds before expiring producer.setTimeToLive(5000);
プロデューサーの send
メソッドで持続時間を設定すると、メッセージの有効期限をメッセージごとに指定することもできます。
// The last parameter of the send method is the time to live, in milliseconds producer.send(message, DeliveryMode.PERSISTENT, 0, 5000)
期限切れアドレスから消費される有効期限切れのメッセージには、以下のプロパティーがあります。
_AMQ_ORIG_ADDRESS
期限切れメッセージの元のアドレスが含まれる
String
プロパティー。_AMQ_ACTUAL_EXPIRY
期限切れのメッセージの実際の有効期間が含まれる
Long
プロパティー。
16.1. 期限切れアドレス
期限切れアドレスを設定して、有効期限切れのメッセージを送信する場所を指定できます。メッセージの有効期限が切れて期限切れアドレスが指定されていない場合、メッセージはキューから削除されドロップされます。
管理 CLI を使用して、address-setting
の expiry-address
を設定できます。以下の例では、jms.queue.exampleQueue
キューの有効期限切れのメッセージが jms.queue.expiryQueue
期限切れアドレスに送信されます。
/subsystem=messaging-activemq/server=default/address-setting=jms.queue.exampleQueue:write-attribute(name=expiry-address,value=jms.queue.expiryQueue)
16.2. 期限切れリーパースレッド
リーパースレッドは定期的にキューを検査して、メッセージの有効期限が切れているかどうかを確認します。管理 CLI を使用して、リーパースレッドのスキャン期間とスレッド優先度を設定できます。
期限切れリーパースレッドのスキャン期間を設定します。スキャン期間は、有効期限切れのメッセージを検出するためにキューをスキャンする頻度 (ミリ秒単位) です。デフォルトは 30000
です。このパラメーターを -1
に設定するとリーパースレッドを無効にできます。
/subsystem=messaging-activemq/server=default:write-attribute(name=message-expiry-scan-period,value=30000)
期限切れリーパースレッドのスレッド優先度を設定します。設定可能な値は 0
から 9
までで、9
の優先度が最も高くなります。デフォルトは 3
です。
/subsystem=messaging-activemq/server=default:write-attribute(name=message-expiry-thread-priority,value=3)