系列八、Java操作RocketMQ之异步消息

一、概述

延迟消息放入RocketMQ后,过一段时间才会被监听到,然后消费。通常适用于消息发送后不想让消费者立即消费,例如下订单业务,订单提交发送一个延时消息,30min后去检查这个订单的状态,如果订单的状态还是未付款,就取消订单释放库存。

二、案例代码

2.1、pom

同案例五

2.2、RocketMQConstant

同案例五

2.3、DelayConsumer

java 复制代码
package org.star.delay.consumer;

import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;
import org.star.constants.RocketMQConstant;

import java.util.List;

/**
 * @Author: 一叶浮萍归大海
 * @Date: 2023/8/29 17:10
 * @Description:
 */
@Slf4j
public class DelayConsumer {

    public static void main(String[] args) throws Exception {
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("DelayConsumerGroup");
        consumer.setNamesrvAddr(RocketMQConstant.NAME_SERVER_ADDR);
        consumer.subscribe("DelayTopic","*");
        consumer.setMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                if (CollectionUtils.isNotEmpty(list)) {
                    String body = StrUtil.utf8Str(list.get(0).getBody());
                    log.info("收到消息 body:{}",body);
                }
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        consumer.start();
        log.info("DelayConsumer start success!");
    }

}

2.4、DelayProducer

java 复制代码
package org.star.delay.producer;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.star.constants.RocketMQConstant;

import java.nio.charset.StandardCharsets;

/**
 * @Author: 一叶浮萍归大海
 * @Date: 2023/8/29 16:38
 * @Description:
 *  messageDelayLevel对应的等待时间
 *  1  ==》1s
 *  2  ==》5s
 *  3  ==》10s
 *  4  ==》30s
 *  5  ==》1m
 *  6  ==》2m
 *  7  ==》3m
 *  8  ==》4m
 *  9  ==》5m
 *  10 ==》6m
 *  11 ==》7m
 *  12 ==》8m
 *  13 ==》9m
 *  14 ==》10m
 *  15 ==》20m
 *  16 ==》30m
 *  17 ==》1h
 *  18 ==》2h
 */
@Slf4j
public class DelayProducer {

    public static void main(String[] args) throws Exception {
        DefaultMQProducer producer = new DefaultMQProducer("DelayProducerGroup");
        producer.setNamesrvAddr(RocketMQConstant.NAME_SERVER_ADDR);
        producer.start();

        Message message = new Message("DelayTopic", ("我是延迟消息").getBytes(StandardCharsets.UTF_8));
        // 延迟10s发送
        message.setDelayTimeLevel(3);
        producer.send(message);

        log.info("延迟消息发送成功");

        producer.shutdown();
    }

}

2.5、控制台打印

bash 复制代码
# 生产者端
19:28:21.347 [main] INFO org.star.delay.producer.DelayProducer - 延迟消息发送成功

# 消费者端
19:28:31.350 [ConsumeMessageThread_3] INFO org.star.delay.consumer.DelayConsumer - 收到消息 body:我是延迟消息
相关推荐
ededabo几秒前
vue/配置axios(前后端数据连通/api接口的调用)
java·前端·javascript·css·vue.js·json
晴子呀2 分钟前
Java基础知识扫盲
java·开发语言
不惑_21 分钟前
缓存技巧 · Spring Cache && Caffeine 高性能缓存库
java·spring·缓存
六月的雨__1 小时前
自驾游拼团系统小程序的设计
java·sql·学习·小程序
Tinalee-电商API接口呀1 小时前
【经验分享】电商api接口——各类商品数据一键获取
java·大数据·开发语言·python·json·产品运营·html5
2401_857638031 小时前
Spring Boot框架在高校心理辅导中的实践
java·spring boot·后端
BUG指挥官1 小时前
7种限流算法打开新方式
java·redis·算法·spring cloud
我不会起名字呀2 小时前
c/c++八股文
java·c语言·c++
户伟伟2 小时前
设计模式六大原则:面向对象设计的核心
java·后端·设计模式
神的孩子都在歌唱2 小时前
个人导航网站介绍和部署
java·开发语言·开源软件