20.6.11. 设置消息过期

介绍

如果发送的消息没有在指定时间(毫秒)内递送给消费者,它们可被设置为过期。使用 Java 消息服务(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
包含过期消息的实际过期时间的长整型属性。
配置消息过期地址

消息过期地址是在 JMS 的 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>
如果消息已过期且没有指定过期地址,消息将从队列里删除并丢弃。
配置 Expiry Reaper 线程

Reaper 线程会定期地检查队列以检验消息是否过期。

  • message-expiry-scan-period
扫描队列以检测过期消息的频率(毫秒为单位,默认是 30000毫秒。-1 表示禁用 Reaper 线程)。
  • message-expiry-thread-priority
Reaper 线程的优先级。它必须是 0 - 9 之间的值,9 表示最高优先级。默认值为 3。