SpringBoot集成RocketMq,小白入门好用

1,407 阅读4分钟

SpringBoot集成RocketMq

RocketMq是一种方便好用的消息中间件,是后端开发者比较熟悉的MQ之一。rocketmq不知生于何年何月,但是可以确定的是由阿里巴巴团队开发一直沿用至今,历经双十一大促销的亿万级流量,稳定可靠,可谓无数开发者居家旅行必备!还不了解的同学可以点击下方充实下: 原来你是这样的RocketMQ

我本机是window环境,Linux大致相同只是服务的启动命令不同

一.创建新项目

像往常一样打开你的开发利器:IDEA 1.先新建一个简单的SpringBoot项目:

在这里插入图片描述
2.pom下添加rocket依赖包,为了方便查看,我把自己的全部依赖复制如下,可根据需要摘取

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.rocketmq</groupId>
    <artifactId>rocketmq</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rocketmq</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <rocketmq.version>4.4.0</rocketmq.version>
    </properties>


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

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <!-- RocketMq客户端相关依赖 -->
            <dependency>
                <groupId>org.apache.rocketmq</groupId>
                <artifactId>rocketmq-client</artifactId>
                <version>${rocketmq.version}</version>
            </dependency>


            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.10</version><!--$NO-MVN-MAN-VER$-->
            </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

注意:引入的rocketmq依赖的版本需要和你服务器上的版本一致,以免发生不必要的错误。

3.application.peroperties文件配置

server.port=8081
#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
rocketmq.config.namesrvAddr=localhost:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/tmp/rocketmq-console/data
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true



二:消息的生产者

注意:正确的引入依赖包

package com.rocketmq.rocketmq.mq.quickstart;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
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.remoting.exception.RemotingException;

import java.io.UnsupportedEncodingException;

/**
 * author wyt 2019-12-06
 */
public class Producer {

    public static void main(String[] args) throws MQClientException, UnsupportedEncodingException, RemotingException, InterruptedException, MQBrokerException {
        //1.创建消息生产者
        DefaultMQProducer defaultMQProducer=new DefaultMQProducer("demo_producer_group");//指定消息发送组
        //2.设置Nameser 的地址
        defaultMQProducer.setNamesrvAddr("localhost:9876");
        //3.开启defaultMQProducer
        defaultMQProducer.start();//此处有异常需要抛出
        //4.创建新消息
        //注意选择 导入这个包的:org.apache.rocketmq.common.message.Message;
        //public Message(String topic, String tags, String keys, byte[] body)


        //body:就是你需要发送的消息
        //RemotingHelper.DEFAULT_CHARSET 设置UTF_8的编码格式
        Message message =new Message(
                "Topic_Demo",//topic:主题
                "Tags_Demo",//tags:标签(主要用于消息过滤作用)
                "Keys_1",//消息的唯一值
                "hello!".getBytes(RemotingHelper.DEFAULT_CHARSET)); //body:就是你需要发送的消息

        //5.发送消息
        SendResult result = defaultMQProducer.send(message);

        System.out.println("消息发送结果    :"+result);
        //6.关闭消息发送对像

        defaultMQProducer.shutdown();


    }
}

二:消息的消费者

package com.rocketmq.rocketmq.mq.quickstart;

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.client.exception.MQClientException;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.remoting.common.RemotingHelper;

import java.io.UnsupportedEncodingException;
import java.util.List;

public class Consumer {


    public static void main(String[] args) throws MQClientException {
//        1.创建一个DefaultMQPushConsumer
        DefaultMQPushConsumer defaultMQPushConsumer=new DefaultMQPushConsumer("Demo_Consumer_Group");


        //        2.设置NameSerADD地址
        defaultMQPushConsumer.setNamesrvAddr("127.0.0.1:9876");
        //        3.设置subscribe  ,这里要读取主题信息
        defaultMQPushConsumer.subscribe(
                "Topic_Demo",//指定要消费的消息主题
                "Tags_Demo"   //过滤规则
        );
        //        4.创建消息监听MessageListener
        // 设置消息拉去上限
        defaultMQPushConsumer.setConsumeMessageBatchMaxSize(2);
        defaultMQPushConsumer.setMessageListener(new MessageListenerConcurrently() {
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                //        5.获取消息信息
                //迭代消息信息
                for (MessageExt mes:list
                     ) {

                    try {
                        //获取主题
                        String Topic=mes.getTopic();
                        //获取标签
                        String tags=mes.getTags();
                        //获取消息
                        byte[] body=mes.getBody();
                        String message=new String(body, RemotingHelper.DEFAULT_CHARSET);
                        System.out.println("Consumer消费信息---topic : "+Topic+"tags  :  "+tags+"   message:  "+message);
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                        //发生消费消息异常 进行从事机制
                        return   ConsumeConcurrentlyStatus.RECONSUME_LATER;
                    }
                }
                //        6.返回消息读取状态
                //说明完成消息消费
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
//      开启消息
        defaultMQPushConsumer.start();

    }
}

三:开启RocketMq服务

windows 环境下: 找到RocketMQ的安装目录,如果不清楚如何安装点击下方: 先后双击打开mqnamesrv.cmd 和mqbroker.cmd

在这里插入图片描述
打开后效果如下即为启动成功: namesrv 启动成功
在这里插入图片描述
broker 启动成功
在这里插入图片描述

四:运行测试

启动消息生产者:Producer 启动后如下:消息发送成功

在这里插入图片描述
接下来启动消息消费者: 消息接收成功
在这里插入图片描述
至此一个简单的springboot集成rocketmq完成。