rocketmq延时定时消息使用总结

使用

 

1. 首先topic所属的消息类型是 定时/延时消息

 
0
 

2. producer 生产者,发消息时,message设定延时、定时属性

 
startDeliverTime 单位:毫秒
其实对于mq来说,定时、延时,传过去的都是未来某个时间的毫秒级时间戳
 
// 延时消息,在指定延迟时间(当前时间之后)进行投递。最大可设置延迟40天投递,单位毫秒(ms)。
Message msg = new Message();
// msg赋值一些属性

// ========= 延时消息
// 以下示例表示消息在3秒后投递。
long delayTime = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli() + 3000;
// 设置消息需要被投递的时间。
msg.setStartDeliverTime(delayTime);
// ========= 延时消息

// ========= 定时消息
// 定时消息,单位毫秒(ms),在指定时间戳(当前时间之后)进行投递,例如2016-03-07 16:21:00投递。如果被设置成当前时间戳之前的某个时刻,消息将立即被投递给消费者。
long timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2016-03-07 16:21:00").getTime();
msg.setStartDeliverTime(timeStamp);
// ========= 定时消息

SendResult sendResult = producer.send(msg);
 
 
 

3. 消费者端同平常处理方式相同

 
 

没生效常见问题

 
延时或者定时消息变成了普通的即时消息,
 
 

1. startDeliverTime 属性的时间戳设置在当前时间戳之前了

 
官网的代码是 long delayTime = System.currentTimeMillis() + 3000;
但是不排除当前机器有时差或者当前机器时间不对的情况
 
// 所以建议将 
System.currentTimeMillis() 

// 替换成
LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli()

// 或者下面这个(当前时间加3s,然后转成毫秒级时间戳)
long l = LocalDateTime.now().plusSeconds(3).toInstant(ZoneOffset.of("+8")).toEpochMilli();
 
 

2. topic的消息类型不是定时/延时消息类型

 
参考最佳实践建议
 
 
 
 

3. 源码不同

 
网上搜索到一种情况,
简单概括,rocketmq客户端用的是阿里云rocketmq的代码
rocketmq服务端使用的是开源的
延时消息属性key不同,所以无效
 
 
 

参考文章

 
收发延时消息开发参考
 
收发定时消息开发参考
posted @ 2022-06-08 10:56  loseself  阅读(2278)  评论(0编辑  收藏  举报