RocketMQ的简单使用

这里需要创建2.x版本的springboot项目

导入依赖

XML 复制代码
    <dependencies>
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.2.3</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.6</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

定义配置文件

XML 复制代码
server:
  port: 3000

rocketmq:
  name-server: xxx.xxx.xxx.xxx:9876  # NameServer 地址
  producer:
    group: rocketmq-4x-service_common-message-execute_pg # 全局发送者组定义

生产者定义

这里的生产者有两个,一个是普通的,一个是延时。

java 复制代码
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.yhy.MessageEvent;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.MessageConst;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
import org.springframework.messaging.support.MessageBuilder;


@Component
@Slf4j
public class GeneralMessageDemoProduce {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    public SendResult sendMessage(String topic, String tag, String keys, MessageEvent messageSendEvent) {
        SendResult sendResult;
        try{
            StringBuilder destinationBuilder = StrUtil.builder().append(topic);
            if(StrUtil.isNotBlank(tag)){
                destinationBuilder.append(":").append(tag);
            }
            Message<?> message = MessageBuilder
                    .withPayload(messageSendEvent)
                    .setHeader(MessageConst.PROPERTY_KEYS,keys)
                    .setHeader(MessageConst.PROPERTY_TAGS, tag)
                    .build();
            // 设置消息的延时级别
            sendResult=rocketMQTemplate.syncSend(
                    destinationBuilder.toString(),
                    message,
                    2000L
            );
            log.info("[普通消息] 消息发送结果:{},消息ID:{},消息Keys:{}", sendResult.getSendStatus(), sendResult.getMsgId(), keys);
        }catch(Throwable ex){
            log.error("[普通消息] 消息发送失败,消息体:{}", JSON.toJSONString(messageSendEvent), ex);
            throw ex;
        }
        return sendResult;
    }
}

延时的

java 复制代码
@Component
@Slf4j
public class ScheduleProducer {
    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    public SendResult sendMessage(String topic, String tag, String keys, MessageEvent messageSendEvent ) {
        SendResult sendResult;
        try {
            StringBuilder destinationBuilder = StrUtil.builder().append(topic);
            if(StrUtil.isNotBlank(tag)){
                destinationBuilder.append(":").append(tag);
            }
            Message<?> message = MessageBuilder
                    .withPayload(messageSendEvent)
                    .setHeader(MessageConst.PROPERTY_KEYS,keys)
                    .setHeader(MessageConst.PROPERTY_TAGS, tag)
                    .build();
            // 设置消息的延时级别
            sendResult=rocketMQTemplate.syncSend(
                    destinationBuilder.toString(),
                    message,
                    2000L,
                    6
            );
            log.info("[延时消息] 消息发送结果:{},消息ID:{},消息Keys:{}", sendResult.getSendStatus(), sendResult.getMsgId(), keys);
        }catch(Throwable ex){
            log.error("[延时消息] 消息发送失败,消息体:{}", JSON.toJSONString(messageSendEvent), ex);
            throw ex;
        }
        return sendResult;
    }
}

消费者定义

这里也是两个消费者,普通的和延时的不在同一个主题的内

java 复制代码
@Slf4j
@Component
@RocketMQMessageListener(
        topic = "rocketmq-yhy_topic",
        selectorExpression = "general",
        consumerGroup = "rocketmq-demo_general-message_cg"
)
public class GeneralMessageDemoConsume implements RocketMQListener<MessageEvent> {
    @Override
    public void onMessage(MessageEvent message) {
        log.info("接到RocketMQ消息,消息体:{}", JSON.toJSONString(message));
    }
}
java 复制代码
import com.alibaba.fastjson.JSON;
import com.yhy.MessageEvent;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@RocketMQMessageListener(
        topic = "Delay",
        selectorExpression = "general",
        consumerGroup = "rocketmq-demo_general-message_cg"
)
public class GeneralMessageDemoConsume_Delay implements RocketMQListener<MessageEvent> {
    @Override
    public void onMessage(MessageEvent message) {
        log.info("接到RocketMQ的延时消息,消息体:{}", JSON.toJSONString(message));
    }
}

发送消息

这里直接在启动类发送。

java 复制代码
@SpringBootApplication
@RestController
public class RocketMQDemoApplication {
    @Autowired
    private GeneralMessageDemoProduce generalMessageDemoProduce;
    @Autowired
    private ScheduleProducer scheduleProducer;

    @PostMapping("/test/send/general-message")
    public String sendGeneralMessage() {
        String keys= UUID.randomUUID().toString();

        MessageEvent messageEvent=new MessageEvent("消息具体内容------yhy",keys);

        SendResult sendResult=generalMessageDemoProduce.sendMessage(
                "rocketmq-yhy_topic",
                "general",
                keys,
                messageEvent
        );

        SendResult sendResult2=scheduleProducer.sendMessage(
                "Delay",
                "general",
                keys,
                messageEvent
        );
        System.out.println(sendResult.getSendStatus().name() );
        System.out.println(sendResult2.getSendStatus().name());
        return sendResult.getSendStatus().name();
    }
        public static void main(String[] args) {
        SpringApplication.run(RocketMQDemoApplication.class, args);
    }
}

postman触发

相关推荐
阿昌喜欢吃黄桃8 天前
RocketMq事务消息原理
java·中间件·消息队列·rocketmq·mq
huisheng_qaq11 天前
【项目篇-01】Vmware虚拟机和环境安装配置
redis·mysql·canal·rocketmq·es·vaware虚拟机
码农飞哥12 天前
RocketMQ消费接口设计实战:为什么HTTP回调接口必须吞掉所有异常,始终返回成功?
网络协议·http·中间件·消息队列·rocketmq
阿维的博客日记12 天前
细说RocketMQ双网卡问题
rocketmq
北城以北888812 天前
RocketMQ简介
java·spring boot·后端·rocketmq
IT界的老黄牛13 天前
RocketMQ 4.x 任意秒数延迟消息工程实战:MQ 粗延迟 + Redis 补精度 + MDC 链路透传
redis·rocketmq·事务消息·延迟消息
至此流年莫相忘13 天前
Windows 环境下 RocketMQ 安装与 NSSM 后台服务化部署指南
windows·rocketmq
折哥的程序人生 · 物流技术专研14 天前
《Java 100 天进阶之路》第95篇:消息队列基础(RocketMQ/Kafka)(2026版)
java·面试·kafka·rocketmq·java-rocketmq·求职招聘
景川呀14 天前
RocketMq知识点
java·rocketmq·java-rocketmq
cfm_291416 天前
RocketMQ源码深度解析(三)消息持久化机制
rocketmq