定时消息这个特性在很多业务中都会用到,比如在电商交易中用户下单之后超过半个小时还没有支付,这时就需要把该订单关闭。在这种场景下,我们可以在创建订单的时候就发送一条延迟消息,该消息在30分钟以后投递给消费者,消费者在收到消息后判断对应订单是否已完成支付,如果没有支付就关闭订单。
目前RocketMQ只支持固定精度级别的定时消息,服务器按照1-N定义了如下级别: “1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h”;;若要发送定时消息,在应用层初始化Message消息对象之后,调用setDelayTimeLevel(int level)方法来设置延迟级别,按照序列取相应的延迟级别,例如level=2,则延迟为5s:
Message msg=new Message("topic_example_java","TagA",("Hello Java Demo RocketMQ:"+i).getBytes(Charset.defaultCharset()));
msg.setDelayTimeLevel(2);
SendResult result=producer.send(msg);
System.out.println("消息发送结果:"+result);
为了实现定时消息,RocketMQ引入了延迟级别的概念,这种方式牺牲了一些灵活性,设计上的考虑是在实际场景中很少有业务需要随意指定时间。