本文共享自华为云社区《RocketMQ-Spring : 实战与源码解析一扫而光》,作者:勇哥java实战共享。

RocketMQ 是大家耳熟能详的音讯行列,开源项目 rocketmq-spring 能够帮助开发者在 Spring Boot 项目中快速整合 RocketMQ。

这篇文章会介绍 Spring Boot 项目运用 rocketmq-spring SDK 完成音讯收发的操作流程,一起笔者会从开发者的视点解读 SDK 的规划逻辑

一文详解RocketMQ-Spring的源码解析与实战

1 SDK 简介

一文详解RocketMQ-Spring的源码解析与实战
项目地址:

github.com/apache/rock…

rocketmq-spring 的本质是一个 Spring Boot starter

Spring Boot 依据“约好大于装备”(Convention over configuration)这一理念来快速地开发、测试、运转和布置 Spring 运用,并能经过简略地与各种发动器(如 spring-boot-web-starter)结合,让运用直接以命令行的办法运转,不需再布置到独立容器中。

Spring Boot starter 结构的发动器运用起来非常便利,开发者只需求在 pom.xml 引入 starter 的依靠界说,在装备文件中编写约好的装备即可。

下面咱们看下 rocketmq-spring-boot-starter 的装备:

1、引入依靠

<dependency>
  <groupId>org.apache.rocketmq</groupId>
  <artifactId>rocketmq-spring-boot-starter</artifactId>
  <version>2.2.3</version>
</dependency>

2、约好装备

一文详解RocketMQ-Spring的源码解析与实战

接下来,咱们别离依照生产者和顾客的次序,详细的讲解音讯收发的操作过程。

2 生产者

首要咱们添加依靠后,进行如下三个步骤:

1、装备文件中装备如下

rocketmq:
  name-server: 127.0.0.1:9876
  producer:
      group: platform-sms-server-group
    # access-key: myaccesskey
    # secret-key: mysecretkey
  topic: sms-common-topic

生产者装备非常简略,首要装备姓名服务地址生产者组

2、需求发送音讯的类中注入 RcoketMQTemplate

@Autowired
private RocketMQTemplate rocketMQTemplate;
​
@Value("${rocketmq.topic}")
private String smsTopic;

3、发送音讯,音讯体能够是自界说目标,也能够是 Message 目标

rocketMQTemplate 类包括多钟发送音讯的办法:

  1. 同步发送 syncSend

  2. 异步发送 asyncSend

  3. 次序发送 syncSendOrderly

  4. oneway发送 sendOneWay

下面的代码展示怎么同步发送音讯。

String destination = StringUtils.isBlank(tags) ? topic : topic + ":" + tags;
SendResult sendResult =
         rocketMQTemplate.syncSend(
            destination, 
            MessageBuilder.withPayload(messageContent).
            setHeader(MessageConst.PROPERTY_KEYS, uniqueId).
            build()
          );
if (sendResult != null) {
    if (sendResult.getSendStatus() == SendStatus.SEND_OK) {
       // send message success ,do something 
    }
}

syncSend 办法的第一个参数是发送的方针,格式是:topic + “:” + tags

第二个参数是:spring-message 标准的 message 目标 ,而 MessageBuilder 是一个东西类,办法链式调用创立音讯目标。

3 顾客

1、装备文件中装备如下

rocketmq:
  name-server: 127.0.0.1:9876
  consumer1:
    group: platform-sms-worker-common-group
    topic: sms-common-topic

2、完成音讯监听器

@Component
@RocketMQMessageListener(
    consumerGroup = "${rocketmq.consumer1.group}",  //消费组
    topic = "${rocketmq.consumer1.topic}"           //主题
)
public class SmsMessageCommonConsumer implements RocketMQListener<String> {
    public void onMessage(String message) {
       System.out.println("普通短信:" + message);
    }
}

顾客完成类也能够完成 RocketMQListener, 在 onMessage 办法里经过 RocketMQ 原生音讯目标 MessageExt 获取更详细的音讯数据

public void onMessage(MessageExt message) {
    try {
        String body = new String(message.getBody(), "UTF-8");
        logger.info("普通短信:" + message);
    } catch (Exception e) {
        logger.error("common onMessage error:", e);
    }
}

4 源码概览

一文详解RocketMQ-Spring的源码解析与实战

最新源码中,咱们能够看到源码中包括四个模块:

1、rocketmq-spring-boot-parent

该模块是父模块,界说项目所有依靠的 jar 包。

2、rocketmq-spring-boot

中心模块,完成了 starter 的中心逻辑。

3、rocketmq-spring-boot-starter

SDK 模块,简略封装,外部项目引证。

4、rocketmq-spring-boot-samples

示例代码模块。这个模块非常重要,当用户运用 SDK 时,能够参阅示例快速开发。

5 starter 完成

咱们要点剖析下 rocketmq-spring-boot 模块的中心源码:

一文详解RocketMQ-Spring的源码解析与实战

spring-boot-starter 完成需求包括如下三个部分:

1、界说 Spring 自身的依靠包和 RocketMQ 的依靠包 ;

2、界说spring.factories 文件

在 resources 包下创立 META-INF 目录后,新建 spring.factories 文件,并在文件中界说主动加载类,文件内容是:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.apache.rocketmq.spring.autoconfigure.RocketMQAutoConfiguration

spring boot 会依据文件中装备的主动化装备类来主动初始化相关的 Bean、Component 或 Service。

3、完成主动加载类

在 RocketMQAutoConfiguration 类的具体完成中,咱们要点剖析下生产者和顾客是怎么别离发动的。

▍生产者发送模板类:RocketMQTemplate

RocketMQAutoConfiguration 类界说了两个默许的 Bean :

一文详解RocketMQ-Spring的源码解析与实战

一文详解RocketMQ-Spring的源码解析与实战

首要SpringBoot项目中装备文件中的装备值会依据属性条件绑定到 RocketMQProperties 目标 中,然后运用 RocketMQ 的原生 API 别离创立生产者 Bean 和拉取顾客 Bean , 别离将两个 bean 设置到 RocketMQTemplate 目标中。

两个要点需求着重:

  • 发送音讯时,将 spring-message 标准下的音讯目标封装成 RocketMQ 音讯目标

    一文详解RocketMQ-Spring的源码解析与实战

  • 默许拉取顾客 litePullConsumer 。拉取顾客一般用于大数据批量处理场景 。

    一文详解RocketMQ-Spring的源码解析与实战

RocketMQTemplate 类封装了拉取顾客的receive办法,以便利开发者运用。

一文详解RocketMQ-Spring的源码解析与实战

▍自界说顾客类

下图是并发顾客的比方:

一文详解RocketMQ-Spring的源码解析与实战

那么 rocketmq-spring 是怎么主动发动顾客呢 ?

一文详解RocketMQ-Spring的源码解析与实战

spring 容器首要注册了音讯监听器后置处理器,然后调用 ListenerContainerConfiguration 类的 registerContainer 办法 。

对比并发顾客的比方,咱们能够看到: DefaultRocketMQListenerContainer 是对 DefaultMQPushConsumer 消费逻辑的封装。

一文详解RocketMQ-Spring的源码解析与实战

封装消费音讯的逻辑,一起满足 RocketMQListener 泛化接口支撑不同参数,比方 String 、MessageExt 、自界说目标 。

首要DefaultRocketMQListenerContainer初始化之后, 获取 onMessage 办法的参数类型 。

一文详解RocketMQ-Spring的源码解析与实战

然后顾客调用 consumeMessage 处理音讯时,封装了一个 handleMessage 办法 ,将原生 RocketMQ 音讯目标 MessageExt 转换成 onMessage 办法界说的参数目标,然后调用 rocketMQListener 的 onMessage 办法。

一文详解RocketMQ-Spring的源码解析与实战

上图右侧标红的代码也就是该办法的精髓:

rocketMQListener.onMessage(doConvertMessage(messageExt));

6 写到最后

开源项目 rocketmq-spring 有很多值得学习的当地 ,咱们能够从如下四个层面逐层进阶:

1、学会怎么运用 :参阅 rocketmq-spring-boot-samples 模块的示例代码,学会怎么发送和接纳音讯,快速编码;

2、模块规划:学习项目的模块分层 (父模块、SDK 模块、中心完成模块、示例代码模块);

3、starter 规划思路 :界说主动装备文件 spring.factories 、规划装备属性类 、在 RocketMQ client 的基础上完成高雅的封装、深化理解 RocketMQ 源码等;

4、举一反三:当咱们理解了 rocketmq-spring 的源码,咱们能够测验仿照该项目写一个简略的 spring boot starter。

点击重视,第一时间了解华为云新鲜技术~