系列八、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:我是延迟消息
相关推荐
努力学编程呀(๑•ี_เ•ี๑)1 分钟前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
码农小卡拉10 分钟前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮18 分钟前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu19 分钟前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
跳动的梦想家h25 分钟前
环境配置 + AI 提效双管齐下
java·vue.js·spring
坚持就完事了27 分钟前
Java中的集合
java·开发语言
wjhx36 分钟前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
YCY^v^40 分钟前
JeecgBoot 项目运行指南
java·学习
人间打气筒(Ada)1 小时前
jenkins基于Pipeline发布项目
java·pipeline·jenkins·流水线·ci·cd·cicd
爬山算法1 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate