Rabbitmq消息过期时间设置

Rabbitmq消息过期时间设置
强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码

消息的过期时间

目前有两种方法可以设置消息的 TTL 。第一种方法是通过队列属性设置,队列中所有消息都有相同的过期时间。第二种方法是对消息本身进行单独设置,每条消息的TTL可以不同。如果两种方法一起使用,则消息的TTL以两者之间较小的那个数值为准。
对于第一种设置队列属性的方法,一旦消息过期,就会从队列中抹去,而在第二种方法中,即使消息过期,也不会马上从队列中抹去,因为每条消息是否过期是在即将投递到消费者之前判定的。

为什么这两种方法处理的方式不一样?
因为第一种方法里,队列中己过期的消息肯定在队列头部,RabbitMQ只要定期从队头开始扫描是否有过期的消息即可。而第二种方法里,每条消
息的过期时间不同,如果要删除所有过期消息势必要扫描整个队列,所以不如等到此消息即将被消费时再判定是否过期,如果过期再进行删除即可。

 

1、声明交换机

 
  1. /**

  2. * 1、声明交换机

  3. */

  4. @Test

  5. public void decalreExchange() throws Exception {

  6.  
  7. String exchange = "hello_ttl";

  8. // 获取到连接

  9. Connection connection = ConnectionUtil.getConnection();

  10. // 获取通道

  11. Channel channel = connection.createChannel();

  12.  
  13. // 声明exchange,指定类型为direct

  14. channel.exchangeDeclare(exchange, BuiltinExchangeType.DIRECT,true,false,false,new HashMap<>());

  15. }

 

2、这里声明了两个队列,hello_ttl_c1给队列设置了消息过期时间,hello_ttl_c2没有设置。

 
  1. /**

  2. * 2、声明队列并绑定到交换机

  3. */

  4. @Test

  5. public void decalreQueueAndBind() throws Exception {

  6.  
  7. String exchange = "hello_ttl";

  8. // 获取到连接

  9. Connection connection = ConnectionUtil.getConnection();

  10. // 获取通道

  11. Channel channel = connection.createChannel();

  12.  
  13. //将队列hello_ttl_c1 绑定到交换机hello_ttl上

  14. String queueName1 = "hello_ttl_c1";

  15. Map<String, Object> argss = new HashMap<String , Object>();

  16. argss.put("x-message-ttl" , 30*1000);//设置队列里消息的ttl的时间30s

  17. // 声明队列

  18. channel.queueDeclare(queueName1, true, false, false, argss);

  19. // 绑定队列到交换机

  20. channel.queueBind(queueName1, exchange, "aaa");

  21.  
  22. //队列hello_ttl_c2 这个是为了测试通过发送时设置ttl

  23. String queueName2 = "hello_ttl_c2";

  24. // 声明队列

  25. channel.queueDeclare(queueName2, true, false, false, null);

  26. // 绑定队列到交换机

  27. channel.queueBind(queueName2, exchange, "bbb");

  28.  
  29. }

可以看出队列上的TTL属性,D是声明队列durable设置为true,表示队列是持久化的。

44eff720ee09cbc8ca00ada710e8108d0f2.jpg

 

3、测试设置过期时间的队列

 
  1. /**

  2. * 测试队列设置的ttl

  3. * @throws Exception

  4. */

  5. @Test

  6. public void sendMessage1() throws Exception {

  7. String exchange = "hello_ttl";

  8. // 获取到连接

  9. Connection connection = ConnectionUtil.getConnection();

  10. // 获取通道

  11. Channel channel = connection.createChannel();

  12. // 消息内容

  13. String message = "Less is more";

  14. channel.basicPublish(exchange, "aaa", null, message.getBytes());

  15. log.debug("Producer send message:{}",message);

  16. channel.close();

  17. connection.close();

  18. }

30s 后,可以看到该消息被删除

9bcff5c1486efdd556ec67fda4fe962eb79.jpg

4、测试发送时设置ttl

 
  1. /**

  2. * 测试消息发送时设置ttl

  3. * @throws Exception

  4. */

  5. @Test

  6. public void sendMessage2() throws Exception {

  7. String exchange = "hello_ttl";

  8. // 获取到连接

  9. Connection connection = ConnectionUtil.getConnection();

  10. // 获取通道

  11. Channel channel = connection.createChannel();

  12. // 消息内容

  13. String message = "Less is more";

  14. AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder();

  15. builder.deliveryMode(2); //DeliveryMode等于2就说明这个消息是persistent的。1是默认,不是持久的。

  16. builder.expiration("30000");// 设置TTL=30000ms

  17. AMQP.BasicProperties properties = builder. build() ;

  18. channel.basicPublish(exchange, "bbb", properties, message.getBytes());

  19. log.debug("Producer send message:{}",message);

  20. channel.close();

  21. connection.close();

  22. }

大约30s后,消息也被删除

0e010779b6e59136ac93a0b0727b6841096.jpg

本文来源huayang183,由架构君转载发布,观点不代表Java架构师必看的立场,转载请标明来源出处:https://javajgs.com/archives/18681

发表评论