消息在发送时有一个可选的生存时间属性。
如果一个消息已经超过了它的生存时间,HornetQ不再将它传递给任何接收者。 服务器会将过期的消息抛弃。
HornetQ的地址可以配置一个过期地址,当消息过期时,它们被从队列中删除并被转移到过期地址中。 多个不同的队列可以绑定到一个过期地址上。这些过期的消息过后可以接收下来以供分析用。
如果使用HornetQ核心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
一个长整型量,代表此消息实际过期时间。
过期地址配置在地址设置(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>
如果没有定义过期地址,当一个消息过期时,它将被删除。配置过期地址时可以使用通配符 来给一组地址配置过期地址。(参见Chapter 13, 了解 HornetQ 通配符的语法)。
HornetQ有一个回收线程定期地检查队列中的消息,目的是发现是否有消息过期。
在hornetq-configuration.xml文件中可以对回收线程进行配置,参数如下:
message-expiry-scan-period
过期消息的扫描间隔(单位毫秒,默认为30000ms)。如要关闭扫描,将其设为-1。
message-expiry-thread-priority
回收线程的优先级(为0到9的整数,9优先级最高。默认是3)。
参见Section 11.1.28, “消息失效”。这个例子展示了在JMS中如何配置使用消息过期功能。