7.过期时间(TTL)
2019-05-28 本文已影响0人
12点前睡觉hhh
TTL,Time to live即过期时间。RabbitMQ可以对消息和队列设置过期时间。
1.设置消息的TTL
目前有两种方式可以设置消息的TTL
1.通过队列属性设置,则队列中的所有消息都有相同的过期时间。
2.对消息本身进行单独设置,则每条消息的过期时间都不同。
如果两个方法一起使用,则取较小值。消息在队列中的生存时间一旦超过TTL,则消费者无法再收到此消息,即变为“死信”。
1.1.在队列属性中设置消息的TTL
在声明队列即方法channel.queueDeclare中加入x-message-ttl参数实现,计数单位是毫秒。
示例如下:
//过期时间6000毫秒
Map<String,Object> args=new HashMap<>();
args.put("x-message-ttl",6000);
channel.queueDeclare("queueDemo",true,false,false,args);
如果不设置TTL,则表示消息永不过期;如果将TTL设置为0,则表示除非此时可以直接将消息投递到消费者,否则该消息会被立即丢弃。
1.2.在消息属性中设置TTL
在basicPublish方法中加入expiration的属性参数,单位为毫秒。
AMQP.BasicProperties.Builder builder=new AMQP.BasicProperties.Builder();
builder.deliveryMode(2);
builder.expiration("6000");
AMQP.BasicProperties properties=builder.build();
channel.basicPublish(EXCHANGE_NAME, "item.insert", properties, message.getBytes());
2.设置队列的TTL
通过channel.queueDelare方法中的x-expires参数可以控制队列被自动删除前处于未使用状态的时间。未使用的意思是队列上没有任何的消费者,队列也没有被重新声明,并且在过期时间段内也未调用过basicGet命令。
RabbitMQ会确保在过期时间到达后将队列删除,但是不保证删除的动作及不及时。在RabbitMQ重启后,持久化的队列的过期时间会重新计算。
实例:
Map<String,Object> args=new HashMap<>();
args.put("x-expires",60000);
channel.queueDeclare("queueDemo",true,false,false,args);
上述代码声明了一个过期时间为1分钟的队列。