配置方式
一、queue 属性配置 message-ttl
在创建 queue 时指定属性 message-ttl,该配置一旦设置后便不可更改,如果需要修改则需要先删除 queue 后重新创建并指定 tll。该配置适用于这个 queue 中的所有消息。
Queue queue = QueueBuilder.durable("queue-name")
.deadLetterExchange("dead-letter-exchange-name")
.deadLetterRoutingKey("dead-letter-routing-key-name")
//指定message-ttl时间
.ttl(1000 * 60 * 60)
.build();
springBean.registerBean("queue-name", queue);
二、 使用策略(policy)指定 queue 的 message-ttl
1. 使用 rabbitmqctl 命令
rabbitmqctl set_policy -p /my_vhost TTL "queue-name" '{"message-ttl":60000}' --apply-to queues该方式只能在 rabbitmq 运行的服务器中使用该命令执行
2. 使用 rabbitmq management 的 API 修改 policy
curl -u username:password -X PUT -H "Content-Type: application/json" \
http://<rabbitmq-server>:15672/api/policies/my_vhost/TTL \
-d '{
"pattern": "queue-name",
"definition": {"message-ttl":60000},
"apply-to": "queues",
"priority": 0
}'注意:queue-name 这部分支持正则表达式,因此可配置多种策略(如使用 ".*" 表示所有 queue),最后按匹配度和优先级选择。
三. MQ 生产者发送消息时指定消息的 expiration 时间
在每次推送消息时指定 expiration
Message.getMessageProperties().setExpiration("600000");
三种方式的关系
三种配置方式可同时存在,但存在以下情形:
1. 当 queue 的属性配置了 message-ttl 后,将不再应用 policy 的 tll 设置
2. 当 queue 存在属性 message-ttl 时,如果通过发送消息指定 expiration 时间,那么实际 tll 会使用两者中最小的时间。比如 message-ttl 设置 60 秒,而 expiration 设置 90 秒,那么该消息的 ttl 时间为 60 秒,反之如果 message-ttl 设置 90 秒,而 expiration 设置 80 秒,那么该消息的 ttl 则是 80 秒。
3. 如果不存在 queue 的属性 message-ttl 时,通过发送消息时指定 expiration 的时间的优先级是大于 policy 的 ttl 设置的。
参考资料:
STOMP Plugin | RabbitMQ
Time-To-Live and Expiration | RabbitMQ