Chapter 22. 过期的消息

消息在发送时有一个可选的生存时间属性。

如果一个消息已经超过了它的生存时间,HornetQ不再将它传递给任何接收者。 服务器会将过期的消息抛弃。

HornetQ的地址可以配置一个过期地址,当消息过期时,它们被从队列中删除并被转移到过期地址中。 多个不同的队列可以绑定到一个过期地址上。这些过期的消息过后可以接收下来以供分析用。

22.1. 过期消息的配置

如果使用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

    一个长整型量,代表此消息实际过期时间

22.2. 配置过期地址

过期地址配置在地址设置(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 通配符的语法)。

22.3. 配置过期回收线程

HornetQ有一个回收线程定期地检查队列中的消息,目的是发现是否有消息过期。

hornetq-configuration.xml文件中可以对回收线程进行配置,参数如下:

  • message-expiry-scan-period

    过期消息的扫描间隔(单位毫秒,默认为30000ms)。如要关闭扫描,将其设为-1

  • message-expiry-thread-priority

    回收线程的优先级(为0到9的整数,9优先级最高。默认是3)。

22.4. 例子

参见Section 11.1.28, “消息失效”。这个例子展示了在JMS中如何配置使用消息过期功能。