第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-settingexpiry-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)