可以在发送消息时设置消息的存活时间。Artemis将不会投递超过存活时间的消息。如果消息在达到存活时间后还未被投递,服务器可以丢弃该消息。可以为Artemis分配一个逾期地址,以便在消息逾期后从队列中删除并发送到逾期地址。多个不同的队列可以绑定到同一个逾期地址,这些逾期消息可以被消费用于进一步的检测。
CORE API
使用Artemis CORE API客户端可以直接在消息里面设置过期时间。如:
// message will expire in 5000ms from now
message.setExpiration(System.currentTimeMillis() + 5000);
JMS生产者可以通过设置TimeToLive来设置:
// messages sent by this producer will be retained for 5s (5000ms) before expiration
producer.setTimeToLive(5000);
通过逾期队列消费的逾期消息有如下属性:
- _AMQ_ORIG_ADDRESS:包含逾期消息的原始地址的String属性值
- _AMQ_ORIG_QUEUE:包含逾期消息的原始队列的String属性值
- _AMQ_ACTUAL_EXPIRY:包含逾期消息的实际到期时间的Long属性值
配置逾期地址
逾期地址由address-setting中定义:
<!-- expired messages in exampleQueue will be sent to the expiry address expiryQueue -->
<address-setting match="exampleQueue">
<expiry-address>expiryQueue</expiry-address>
</address-setting>
如果消息逾期且未定义逾期地址,逾期消息将从队列中移除并且被丢弃。
检测线程将定期检测队列中消息是否已经逾期,在broker.xml中定义这些配置:
- message-expiry-scan-period:检测队列消息是否逾期的频率(单位ms,默认为30000ms,设置-1禁用检测线程)
- message-expiry-thread-priority:检测线程的优先级(必须介于1~10之间,10为最高优先级,默认值为3)
注:此系列文章为Apache Artemis V2.6.2官方使用文档的简要翻译文档(非完全按照官方文档排版进行翻译,有删减),个人能力有限如有错误请谅解。源文档地址:http://activemq.apache.org/artemis/docs/latest/index.html