• 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不同,所以无效
     
     
     

    参考文章

     
    收发延时消息开发参考
     
    收发定时消息开发参考
  • 相关阅读:
    ASP.NET 取得 Request URL 的各个部分
    将GAC中的DLL复制出来
    SqlServer2008 手动提交
    SQL获取表中最新插入的记录
    HTTP/1.1 500 Server Error错误解决方法
    ORACLE 物化视图
    JIMMY ZHANG告诉你快速提高自己的开发能力
    走进设计模式系列之开篇
    大话设计模式之:Adapter模式
    jquery+bootstrap自定义插件开发之dropdownlist
  • 原文地址:https://www.cnblogs.com/loseself/p/16354863.html
Copyright © 2020-2023  润新知