rocketmq延时定时消息使用总结
使用
1. 首先topic所属的消息类型是 定时/延时消息
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不同,所以无效
参考文章
收发延时消息开发参考
收发定时消息开发参考