RocketMQ入门级搭建

本文章的目的不在于讲解RocketMQ相关的基础知识点,此文章主要提供源码,帮助那些想要快速搭建一个入门级RocketMQ的初学者的同学。相关源码可参考如下:

项目结构:

建立父工程,pom文件导入依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.cainiao</groupId>
    <artifactId>RocketDemo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>demo-api</module>
        <module>demo-producer</module>
        <module>demo-Consumer</module>
        <module>demo-Consumer-Slave</module>
    </modules>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
    </parent>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


</project>

模块(demo-api):定义相关的pojo类和接口类

1)首先引入pom依赖(demo-api):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>RocketDemo</artifactId>
        <groupId>org.cainiao</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-api</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


</project>

2)模块(demo-api)项目结构:

 3)ISender简单接口定义:

package com.cainiao.message;

import com.cainiao.pojo.Student;

public interface ISender {

    /**
     * RocketMQ 消息发送 (DefaultMQProducer)
     * @param student
     * @return
     */
    public String demoSender(Student student);

    /**
     * RocketMQ 消息发送 (RocketMQTemplate)
     * @param student
     */
    public void templateSender(Student student);
}

4)Pojo类相关定义:

package com.cainiao.pojo;

import java.io.Serializable;

public class Student implements Serializable {

    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

模块(demo-producer):消息生产者

1)首先引入pom依赖(demo-producer):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>RocketDemo</artifactId>
        <groupId>org.cainiao</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-producer</artifactId>

    <dependencies>
        <!--    接口引用    -->
        <dependency>
            <groupId>org.cainiao</groupId>
            <artifactId>demo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--    rocketMQ 消息队列    -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>org.apache.rocketmq</groupId>-->
<!--            <artifactId>rocketmq-common</artifactId>-->
<!--            <version>4.5.1</version>-->
<!--        </dependency>-->
        <!--    监控器    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--    lombok    -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

    </dependencies>


</project>

2)模块(demo-producer)项目结构:

 3)生产者启动类:

package com.cainiao;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoProducer {

    public static void main(String[] args) {
        SpringApplication.run(DemoProducer.class, args);
    }
}

4)发送消息接口实现类:(分别采用默认的DefaultMQProducer和采用RocketMQTemplate进行发送消息,两种方式)

package com.cainiao.service;

import com.alibaba.fastjson.JSON;
import com.cainiao.message.ISender;
import com.cainiao.pojo.Student;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.common.RemotingHelper;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class IMessageSender implements ISender {

    @Value("${mq.rocket.topic}")
    private String topic;

    @Value("${mq.rocket.tag}")
    private String tag;

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    @Override
    public String demoSender(Student student) {
        /**
         * 通过java -jar rocketmq-console-ng-1.0.0.jar
         * 启动可视化插件
         */
        try{
            DefaultMQProducer producer = new DefaultMQProducer("demo_producer");
            producer.setNamesrvAddr("127.0.0.1:9876");
            producer.start();
            Message message = new Message("chenke_topic", "message", String.valueOf(System.currentTimeMillis()),
                    JSON.toJSONString(student).getBytes(RemotingHelper.DEFAULT_CHARSET));
            SendResult result = producer.send(message);
            log.info("消息发送成功: " + message);
            producer.shutdown();
        }catch (Exception e){
            log.error("消息发送失败");
        }

        return "消息发送成功";
    }

    @Override
    public void templateSender(Student student) {
        try{
            Message message = new Message(topic, "tag4", JSON.toJSONString(student).getBytes(RemotingHelper.DEFAULT_CHARSET));
            log.info("开始发送消息时间:" + System.currentTimeMillis());
            rocketMQTemplate.getProducer().send(message);
            log.info("消息发送成功时间:" + System.currentTimeMillis());
        }catch (Exception e){
            log.error("消息发送失败时间:" + System.currentTimeMillis());
        }

    }
}

5)配置文件application.properties

# RocketMQ配置
rocketmq.nameServer=127.0.0.1:9876
rocketmq.producer.group=demo_producer

# Rocket 相关主题和标签配置
mq.rocket.topic=chenke_topic
mq.rocket.tag=message

6)采用Junit5编写测试类进行功能测试:

package com.cainiao.service;

import com.cainiao.DemoProducer;
import com.cainiao.message.ISender;
import com.cainiao.pojo.Student;
import io.netty.handler.codec.compression.ZstdEncoder;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest(classes = DemoProducer.class)
class IMessageSenderTest {

    @Autowired
    private ISender sender;

    @Test
    public void testIMessageSender(){
        Student student = new Student();
        student.setName("chenke");
        student.setAge(25);
        String res = sender.demoSender(student);
    }

    @Test
    public void testTemplateSender() {
        Student student = new Student();
        student.setName("test2");
        student.setAge(30);
        sender.templateSender(student);
    }
}

模块(demo-consumer):Master 主消息消费者

1)首先引入pom依赖(demo-consumer):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>RocketDemo</artifactId>
        <groupId>org.cainiao</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-Consumer</artifactId>

    <dependencies>
        <!--    接口引用    -->
        <dependency>
            <groupId>org.cainiao</groupId>
            <artifactId>demo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--    rocketMQ 消息队列    -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>
        <!--    监控器    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--    lombok    -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>


</project>

2)整体模块结构:

 3)Master消费者启动类(此处)

package com.cainiao.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoConsumer {
    public static void main(String[] args) {
        SpringApplication.run(DemoConsumer.class, args);
    }
}

4)指定消费者对某一个Topic进行监听,并设置其消费者组:

package com.cainiao.consumer;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.annotation.SelectorType;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

@Slf4j
@RocketMQMessageListener(topic = "${mq.rocket.topic}",
                            consumerGroup = "${rocketmq.consumer.group}",
                            messageModel = MessageModel.BROADCASTING,
                            selectorExpression = "tag2 || tag4",
                            selectorType = SelectorType.TAG)
@Component
public class IMessageConsumer implements RocketMQListener<MessageExt> {
    @Override
    public void onMessage(MessageExt messageExt) {
        String msgId = messageExt.getMsgId();
        String tags = messageExt.getTags();
        String keys = messageExt.getKeys();
        byte[] bodyB = messageExt.getBody();
        String body = new String(bodyB);
        log.info("Master已消费: " + body);
    }
}

5)配置文件设置application.properties

# RocketMQ配置 (Master)
rocketmq.nameServer=127.0.0.1:9876
rocketmq.consumer.group=consumer_group

# Rocket 相关主题和标签配置
mq.rocket.topic=chenke_topic
# mq.rocket.tag=message1

模块(demo-consumer):Slave 从消息消费者

1)首先引入pom依赖(demo-consumer-slave):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>RocketDemo</artifactId>
        <groupId>org.cainiao</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>demo-Consumer-Slave</artifactId>

    <dependencies>
        <!--    接口引用    -->
        <dependency>
            <groupId>org.cainiao</groupId>
            <artifactId>demo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--    rocketMQ 消息队列    -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.2.1</version>
        </dependency>
        <!--    监控器    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--    lombok    -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

</project>

2)整体模块结构:

 3)Slave 消费者启动类(此处)

package com.cainiao.slave.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DemoConsumerSlave {

    public static void main(String[] args) {
        SpringApplication.run(DemoConsumerSlave.class, args);
    }
}

4)指定Slave 从消费者对某一个Topic进行监听,并设置其消费者组:

package com.cainiao.slave.consumer;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.annotation.SelectorType;
import org.springframework.stereotype.Component;
import org.apache.rocketmq.spring.core.RocketMQListener;

@Slf4j
@RocketMQMessageListener(topic = "${mq.rocket.topic}",
                        consumerGroup = "${rocketmq.consumer.group}",
                        messageModel = MessageModel.BROADCASTING,
                        selectorExpression = "tag1 || tag3",
                        selectorType = SelectorType.TAG)
@Component
public class SlaverConsumer implements RocketMQListener<MessageExt>{

    @Override
    public void onMessage(MessageExt messageExt) {
        String msgId = messageExt.getMsgId();
        String keys = messageExt.getKeys();
        String tags = messageExt.getTags();
        byte[] bodyB = messageExt.getBody();
        String body = new String(bodyB);
        log.info("Slave已消费: " + body);
    }
}

5)配置文件设置application.properties

# RocketMQ配置 (Slave)
rocketmq.nameServer=127.0.0.1:9876
rocketmq.consumer.group=consumer_group

# Rocket 相关主题和标签配置
mq.rocket.topic=chenke_topic
# mq.rocket.tag=message2

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值