java实战项目源码分享网站(java项目源码大全)

本篇文章给大家谈谈java实战项目源码分享网站,以及java项目源码大全对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

本文分享自华为云社区《RocketMQ-Spring:实战与源码解析一网打尽-云社区-华为云》,作者:勇哥java实战分享。

RocketMQ是大家耳熟能详的消息队列,开源项目rocketmq-spring可以帮助开发者在SpringBoot项目中快速整合RocketMQ。

这篇文章会介绍SpringBoot项目使用rocketmq-springSDK实现消息收发的操作流程,同时笔者会从开发者的角度解读SDK的设计逻辑

1SDK简介

项目地址:

https://github.com/apache/rocketmq-spring

rocketmq-spring的本质是一个SpringBootstarter

SpringBoot基于“约定大于配置”(Conventionoverconfiguration)这一理念来快速地开发、测试、运行和部署Spring应用,并能通过简单地与各种启动器(如spring-boot-web-starter)结合,让应用直接以命令行的方式运行,不需再部署到独立容器中。

SpringBootstarter构造的启动器使用起来非常方便,开发者只需要在pom.xml引入starter的依赖定义,在配置文件中编写约定的配置即可。

下面我们看下rocketmq-spring-boot-starter的配置:

1、引入依赖

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

2、约定配置

接下来,我们分别按照生产者和消费者的顺序,详细的讲解消息收发的操作过程。

2生产者

首先我们添加依赖后,进行如下三个步骤:

1、配置文件中配置如下

rocketmq:\nname-server:127.0.0.1:9876\nproducer:\ngroup:platform-sms-server-group\nsecret-key:mysecretkey\ntopic:sms-common-topic

生产者配置非常简单,主要配置名字服务地址生产者组

2、需要发送消息的类中注入RcoketMQTemplate

@Autowired\nprivateRocketMQTemplaterocketMQTemplate;\n\n@Value(&34;)\nprivateStringsmsTopic;

3、发送消息,消息体可以是自定义对象,也可以是Message对象

rocketMQTemplate类包含多钟发送消息的方法:

同步发送syncSend异步发送asyncSend顺序发送syncSendOrderlyoneway发送sendOneWay

下面的代码展示如何同步发送消息。

Stringdestination=StringUtils.isBlank(tags)?topic:topic+&34;+tags;\nSendResultsendResult=\nrocketMQTemplate.syncSend(\ndestination,\nMessageBuilder.withPayload(messageContent).\nsetHeader(MessageConst.PROPERTY_KEYS,uniqueId).\nbuild()\n);\nif(sendResult!=null){\nif(sendResult.getSendStatus()==SendStatus.SEND_OK){\n//sendmessagesuccess,dosomething\n}\n}

syncSend方法的第一个参数是发送的目标,格式是:topic+&34;+tags

第二个参数是:spring-message规范的message对象,而MessageBuilder是一个工具类,方法链式调用创建消息对象。

3消费者

1、配置文件中配置如下

rocketmq:\nname-server:127.0.0.1:9876\nconsumer1:\ngroup:platform-sms-worker-common-group\ntopic:sms-common-topic

2、实现消息监听器

@Component\n@RocketMQMessageListener(\nconsumerGroup=&34;,//消费组\ntopic=&34;//主题\n)\npublicclassSmsMessageCommonConsumerimplementsRocketMQListener<String>{\npublicvoidonMessage(Stringmessage){\nSystem.out.println(&34;+message);\n}\n}

消费者实现类也可以实现RocketMQListener<MessageExt>,在onMessage方法里通过RocketMQ原生消息对象MessageExt获取更详细的消息数据

publicvoidonMessage(MessageExtmessage){\ntry{\nStringbody=newString(message.getBody(),&34;);\nlogger.info(&34;+message);\n}catch(Exceptione){\nlogger.error(&34;,e);\n}\n}

4源码概览

最新源码中,我们可以看到源码中包含四个模块:

1、rocketmq-spring-boot-parent

该模块是父模块,定义项目所有依赖的jar包。

2、rocketmq-spring-boot

核心模块,实现了starter的核心逻辑。

3、rocketmq-spring-boot-starter

SDK模块,简单封装,外部项目引用。

4、rocketmq-spring-boot-samples

示例代码模块。这个模块非常重要,当用户使用SDK时,可以参考示例快速开发。

5starter实现

我们重点分析下rocketmq-spring-boot模块的核心源码:

spring-boot-starter实现需要包含如下三个部分:

1、定义Spring自身的依赖包和RocketMQ的依赖包;

2、定义spring.factories文件

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

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

springboot会根据文件中配置的自动化配置类来自动初始化相关的Bean、Component或Service。

3、实现自动加载类

在RocketMQAutoConfiguration类的具体实现中,我们重点分析下生产者和消费者是如何分别启动的。

▍生产者发送模板类:RocketMQTemplate

RocketMQAutoConfiguration类定义了两个默认的Bean:

首先SpringBoot项目中配置文件中的配置值会根据属性条件绑定到RocketMQProperties对象中,然后使用RocketMQ的原生API分别创建生产者Bean和拉取消费者Bean,分别将两个bean设置到RocketMQTemplate对象中。

两个重点需要强调:

发送消息时,将spring-message规范下的消息对象封装成RocketMQ消息对象默认拉取消费者litePullConsumer。拉取消费者一般用于大数据批量处理场景。

RocketMQTemplate类封装了拉取消费者的receive方法,以方便开发者使用。

▍自定义消费者类

下图是并发消费者的例子:

那么rocketmq-spring是如何自动启动消费者呢?

spring容器首先注册了消息监听器后置处理器,然后调用ListenerContainerConfiguration类的registerContainer方法。

对比并发消费者的例子,我们可以看到:DefaultRocketMQListenerContainer是对DefaultMQPushConsumer消费逻辑的封装。

封装消费消息的逻辑,同时满足RocketMQListener泛化接口支持不同参数,比如String、MessageExt、自定义对象。

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

然后消费者调用consumeMessage处理消息时,封装了一个handleMessage方法,将原生RocketMQ消息对象MessageExt转换成onMessage方法定义的参数对象,然后调用rocketMQListener的onMessage方法。

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

rocketMQListener.onMessage(doConvertMessage(messageExt));

6写到最后

开源项目rocketmq-spring有很多值得学习的地方,我们可以从如下四个层面逐层进阶:

1、学会如何使用:参考rocketmq-spring-boot-samples模块的示例代码,学会如何发送和接收消息,快速编码;

2、模块设计:学习项目的模块分层(父模块、SDK模块、核心实现模块、示例代码模块);

3、starter设计思路:定义自动配置文件spring.factories、设计配置属性类、在RocketMQclient的基础上实现优雅的封装、深入理解RocketMQ源码等;

4、举一反三:当我们理解了rocketmq-spring的源码,我们可以尝试模仿该项目写一个简单的springbootstarter。

关注\u0002点击下方,第一时间了解华为云新鲜技术~

华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云

文章分享结束,java实战项目源码分享网站和java项目源码大全的答案你都知道了吗?欢迎再次光临本站哦!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平