RocketMQ延时消息使用

RocketMQ延时消息使用

生产者实例

@Component
public class DelayProducer {
    @Value("${rocketmq.producer.group}")
    private String producerGroup; // 生产者分组
    @Value("${rocketmq.name-server}")
    private String nameServer; // 服务地址
    @Value("${rocketmq.consumer.topic}")
    private String topic; // 生产者主题
    // RocketMQ(延时消息)生产者
    /*
    * tag:
    * OrderAutoCancel 订单自动取消
    * OrderAutoFinish 订单自动完成
    * OrderAutoReceive 订单自动收货
    * SendExpireWarn       发货超期提醒
    * WillPayExpire    将要超期付款提醒
    * PayExpire        超期付款提醒
    * delayTimeLevel:
    * 2  24小时
    * 3  7天
    * 4  15天
    * 5  57天
    * 6  60天
    * */
    //发送延时消息
    public void sendMsg(String tag,Integer parameter,Object object) throws Exception {
        // 实例化消息生产者Producer
        DefaultMQProducer producer = new DefaultMQProducer(producerGroup);
        // 设置NameServer的地址
        producer.setNamesrvAddr(nameServer);
        // 启动Producer实例
        producer.start();
        // RockerMQUtil.TOPIC, RockerMQUtil.TAGS,null, JSON.toJSONString(orderJc).getBytes()
        // 参数一是 topic主题,消费者通过匹配topic进行消费,tags对应的是标签,一个topic有多个tags,keys是标识,body对应的是实体
        Message msg = new Message(topic
                , tag,null, JSON.toJSONString(object).getBytes());
        //"5s 1d 7d 15d 57d 60d"
        //设置消息延迟级别为6,也就是延迟60天。
        Integer delayTimeLevel = null;
        if(parameter == 24){ // 如果延时时间为24小时,那设置他的等级为2
            delayTimeLevel = 2;
        }else if(parameter == 7){ // 如果延时时间为7天,那设置他的等级为3
            delayTimeLevel = 3;
        }else if(parameter == 15){ // 如果延时时间为15天,那设置他的等级为4
            delayTimeLevel = 4;
        }else if(parameter == 57){ // 如果延时时间为57天,那设置他的等级为5
            delayTimeLevel = 5;
        }else if(parameter == 60){ // 如果延时时间为60天,那设置他的等级为6
            delayTimeLevel = 6;
        }else if(parameter ==30){
            delayTimeLevel = 7;
        }else{
            delayTimeLevel = 1; // 如果都不是,那设置延时时间为5秒,等级为1
        }
        msg.setDelayTimeLevel(delayTimeLevel);
        // 发送消息到一个Broker
        producer.send(msg);
        // 如果不再发送消息,关闭Producer实例。
        producer.shutdown();
    }

}

消费者实例

@Component
@RocketMQMessageListener(topic = RockerMQUtil.TOPIC, consumerGroup = RockerMQUtil.CONSUMERGROUP,
        messageModel = MessageModel.BROADCASTING)// 使用广播模式进行匹配
public class Consumer implements RocketMQListener<MessageExt> {
    @Resource
    private IOrderService orderService;
    @Override
    public void onMessage(MessageExt message) {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
        // 实例化消费者
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(RockerMQUtil.CONSUMERGROUP);
        // 设置NameServer的地址
        consumer.setNamesrvAddr(RockerMQUtil.NAMESRVADDR);
        // 订阅一个或者多个Topic,以及Tag来过滤需要消费的消息
        try {
            consumer.subscribe(RockerMQUtil.TOPIC, "*");
        } catch (MQClientException e) {
            e.printStackTrace();
        }
        // 输出消息被消费的时间
        System.out.printf("%s %s Receive New Messages:%n"
                    , sdf.format(new Date())
                    , Thread.currentThread().getName());
         // 注册回调实现类来处理从broker拉取回来的消息
        String body=new String(message.getBody());
        OrderUtil entity = JSON.parseObject(body,  OrderUtil.class);
        Order order = orderService.getOne(new QueryWrapper<Order>().eq("id",entity.getId())
                .select("status","id"));
        if(order.getStatus() == 5){ // 在线付款订单超时未付款,取消订单
            orderService.update(new UpdateWrapper<Order>().eq("id",entity.getId())
                    .set("status",7));
            System.out.println("订单取消成功");
        }
        System.out.printf("\tMsg Id: %s%n", message.getMsgId());
        System.out.printf("\tBody: %s%n", new String(message.getBody()));
        // 启动消费者实例
        try {
            consumer.start();
        } catch (MQClientException e) {
            e.printStackTrace();
        }
        System.out.println("Consumer Started.");
    }
}

自定义延时时间

在服务器端(rocketmq-broker端)的属性配置文件broker.conf中加入以下行:

messageDelayLevel=1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
描述了各级别与延时时间的对应映射关系。

  1. 这个配置项配置了从1级开始,各级延时的时间,可以修改这个指定级别的延时时间;

  2. 时间单位支持:s、m、h、d,分别表示秒、分、时、天;

  3. 默认值就是上面声明的,可手工调整;

  4. 默认值已够用,不建议修改这个值。

RocketMQ支持延时消息,可以通过设置消息延时级别(Delay Level)来指定消息延时时间。延时级别是通过设置消息的属性来实现的。 在RocketMQ中,延时消息的实现原理是通过将消息发送到延时消息队列(Delay Queue)中,在指定的延时时间后再将消息延时消息队列中取出,发送到目标消息队列中。 延时消息可以用于各种场景,比如定时任务、订单超时提醒等。 下面是使用RocketMQ发送延时消息的示例代码: ``` // 创建生产者实例 DefaultMQProducer producer = new DefaultMQProducer("producer_group"); // 设置NameServer地址 producer.setNamesrvAddr("localhost:9876"); // 启动生产者实例 producer.start(); // 创建消息实例,设置消息内容 Message msg = new Message("topic_name", "tag_name", "Hello RocketMQ".getBytes()); // 设置消息延时级别为3,表示延时10s发送 msg.setDelayTimeLevel(3); // 发送消息 SendResult result = producer.send(msg); // 输出发送结果 System.out.println(result); // 关闭生产者实例 producer.shutdown(); ``` 在这个示例中,我们创建了一个生产者实例,并设置了NameServer地址。然后创建一个消息实例,设置消息内容,并将延时级别设置为3。最后发送消息,并输出发送结果。 需要注意的是,延时消息延时时间是在消息发送后计算的,而不是在消息创建时计算的。因此,如果需要精确控制延时时间,需要考虑网络延迟等因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值