版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章SpringBoot其他功能——异步消息SpringBoot实用教程(第4版)目录01异步消息模型及中间件1.异步消息模型2.JMS3.AMQP4.消息中间件异步消息模型及中间件1.异步消息模型在SpringBoot中,异步消息是通过“消息代理”实现的,当发送者发出消息后,消息将暂时先由消息代理保管,消息代理将消息存入一个队列(Queue),当有接收者要求接收消息时,消息代理再从队列中取出消息传递给接收者,然后清除该消息(这时候队列里已经没有这条消息了),如图8.1所示。异步消息模型及中间件2.JMSJMS(JavaMessageService,Java消息服务)是Java平台上面向消息中间件的技术规范,它的设计目标是为方便系统中Java应用程序间的消息交换,并且通过提供标准的产生、发送、接收消息的接口来简化异步消息功能开发。JMS所提供的接口主要有:(1)ConnectionFactory(连接工厂)它是用户创建的到JMS消息代理连接的被管对象,JMS客户通过可移植的接口访问连接,这样当底层的实现改变时,上层代码无须改动。(2)Connection(连接对象)连接对象代表了一条应用程序和消息代理之间的通信链路。在获得了连接工厂后,就可以创建一个与JMS消息代理的连接,它允许用户进一步创建会话以发送消息到目的地,或从目的地接收消息。(3)Destination(目的地)目的地是指消息发布和接收的地点,它是包装了目的地标识符的被管对象,由JMS管理员创建这些对象,然后用户通过JNDI来发现它们。(4)Session(会话)会话表示一个单线程的上下文,用于发送和接收消息。会话可以支持事务,如果用户选择了事务支持,会话上下文将保存一组消息,直到事务被提交才发送这些消息。而在提交事务之前,用户可以使用回滚操作取消这些消息。异步消息模型及中间件(5)MessageProducer(生产者)生产者是由会话创建的对象,用于发送消息到目的地。用户既可以创建某个目的地的生产者,也可以创建一个通用的生产者,待发送消息时再指定其目的地。(6)MessageConsumer(消费者)消费者也是由会话创建的对象,用于接收目的地的消息。(7)Message(消息)消息是在生产者和消费者之间传送的对象,实际上就是从一个应用程序传送到另一个应用程序的对象。一个消息由3个主要部分构成。①消息头(必须):包含用于识别和为消息寻找路由的操作设置。②属性(可选):一组多个消息属性可用于创建定制的字段和过滤器(消息选择器),另外还包含额外的属性以支持其他消息代理实现和用户的兼容。③消息体(可选):消息可以有一个消息体,JMS允许用户创建文本、映射、字节、流和对象这5种不同类型的消息体。异步消息模型及中间件3.AMQPAMQP的基本概念如下:(1)客户端AMQP连接或会话的发起者。AMQP是非对称的,客户端生产和消费消息,服务器存储和路由这些消息。(2)服务器接受客户端连接,实现AMQP消息队列和路由功能的进程,实际上也就是消息代理的实现(中间件)。(3)AMQP模型它是一个由关键实体和语义表示的逻辑框架,遵从AMQP规范的服务器必须提供这些实体和语义。为了实现规范中定义的语义,客户端可以发送命令来控制AMQP服务器。(4)连接一个网络连接,例如TCP/IP套接字连接。(5)端点一个AMQP连接包括两个端点,一个是客户端,一个是服务器。(6)搭档当描述两个端点之间的交互过程时,使用术语“搭档”来表示“另一个”端点的简记法。例如定义端点A和端点B,当它们进行通信时,端点B就是端点A的搭档,端点A也是端点B的搭档。异步消息模型及中间件(7)会话端点之间的命名对话,在一个会话上下文中,保证消息“恰好传递一次”。(8)信道多路复用连接中的一条独立的双向数据流通道,为会话提供物理传输介质。(9)帧AMQP传输的一个原子单元。(10)段帧的有序集合,形成一个完整子单元。(11)片段集段的有序集合,形成一个逻辑工作单元。(12)消息头描述消息数据属性的一种特殊段。(13)消息体包含应用程序数据的一种特殊段。消息体对于服务器来说完全透明,即服务器不能查看或修改消息体。(14)消息内容包含在消息体中的数据。异步消息模型及中间件(15)消息队列一个命名实体,用来保存消息直到消费者接收。(16)消费者一个从消息队列中请求消息的客户端应用程序。(17)生产者一个向交换器发布消息的客户端应用程序。(18)控制单向指令,AMQP规范假设这些指令的传输是不可靠的。(19)命令需要确认的指令,AMQP规范规定这些指令的传输是可靠的。(20)异常在执行一个或多个命令时可能发生的错误状态。(21)类一批用来描述某种特定功能的AMQP命令或者控制。(22)交换器服务器中的实体,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。异步消息模型及中间件(23)交换器类型基于不同路由语义的交换器类。(24)绑定器消息队列和交换器之间的关联。(25)绑定器关键字绑定的名称。一些交换器类型可能使用这个名称作为定义绑定器路由行为的模式。(26)路由关键字一个消息头,交换器可以用它来决定如何路由某条消息。(27)持久存储一种服务器资源,当服务器重启时,保存的消息数据不会丢失。(28)临时存储一种服务器资源,当服务器重启时,保存的消息数据会丢失。(29)持久化服务器将消息保存在可靠磁盘存储中,当服务器重启时,消息不会丢失。(30)非持久化服务器将消息保存在内存中,当服务器重启时,消息可能丢失。(31)虚拟主机一批交换器、消息队列及相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。客户端应用程序在登录到服务器之后,可选择一个虚拟主机。异步消息模型及中间件4.消息中间件基于上述这两种规范,很多厂商和开发者社区纷纷推出各自的消息中间件产品,其中比较著名的有:Apache基金会的ActiveMQ和Kafka、JBoss社区的HornetQ、TheOpenJMSGroup的OpenJMS、Rabbit科技的RabbitMQ等。当前最为主流的两大消息中间件是ActiveMQ和RabbitMQ。ActiveMQ是JMS的实现,而RabbitMQ则是AMQP的实现。SpringBoot为这两个中间件都提供了很好的支持,它们在应用功能上的地位和作用是对等的,实际开发中可根据需求和使用偏好选用任意一款。目录02ActiveMQ实现异步消息1.ActiveMQ安装使用2.发送者程序3.接收者程序ActiveMQ实现异步消息【实例8.1】用ActiveMQ作为消息中间件,发送者(商家)在页面上编辑并发出商品降价促销信息,接收者(顾客)打开页面可看到该信息。1.ActiveMQ安装使用(1)下载ActiveMQ访问ActiveMQ官网/,如图8.2所示,点页面左块“ActiveMQ"Classic"”区的“DownloadLatest”按钮转至下载页。ActiveMQ实现异步消息在下载页(/components/classic/download/)上点链接“apache-activemq-5.16.3-bin.zip”下载Windows版的ActiveMQ,如图8.3所示。ActiveMQ实现异步消息(2)启动ActiveMQ①打开解压的ActiveMQ存盘目录,从其下\conf目录中找到配置文件activemq.xml,打开,找到并注释掉其中的一行(如下加黑):...<transportConnectors><!--DOSprotection,limitconcurrentconnectionsto1000andframesizeto100MB--><transportConnectorname="openwire"uri="tcp://:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><!--<transportConnectorname="amqp"uri="amqp://:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>--><transportConnectorname="stomp"uri="stomp://:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnectorname="mqtt"uri="mqtt://:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnectorname="ws"uri="ws://:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/></transportConnectors>...ActiveMQ实现异步消息操作如图8.4所示。ActiveMQ实现异步消息②进入ActiveMQ存盘目录下的\bin\win64子目录(注:因笔者的计算机操作系统是64位,若用的是32位系统,则要进入\bin\win32子目录),看到有一个activemq.bat文件,如图8.5所示,双击即可启动ActiveMQ。ActiveMQ实现异步消息此时,弹出命令行窗口如图8.6所示,输出启动信息,没有错误就是启动成功。ActiveMQ实现异步消息(3)访问ActiveMQ打开浏览器,地址栏输入http://localhost:8161回车,出现登录界面如图8.7所示。ActiveMQ实现异步消息输入用户名密码(默认都是admin),点“登录”按钮进入ActiveMQ的欢迎页面,如图8.8所示。ActiveMQ实现异步消息(4)查看消息队列在后面运行程序时,需要时刻查看ActiveMQ所管理队列中的消息,这里简要介绍一下操作方法。①在ActiveMQ欢迎页面上点“ManageActiveMQbroker”链接(见上图),进入ActiveMQ的管理页面,如图8.9所示。②点管理页面导航栏上的“Queues”项,转至队列查看页面,如图8.10所示。
ActiveMQ实现异步消息2.发送者程序先来开发发送者程序,步骤如下。(1)创建项目创建SpringBoot项目,项目名为ActiveSender,在出现的向导界面“Dependencies”列表中勾选SpringBoot基本框架(“Web”→“SpringWeb”)、Thymeleaf引擎组件(“TemplateEngines”→“Thymeleaf”)、Lombok模型简化组件(“DeveloperTools”→“Lombok”)。为使项目支持ActiveMQ,最重要的是添加SpringActiveMQ框架,勾选“Messaging”→“SpringforApacheActiveMQ5”,如图8.11所示。添加的SpringActiveMQ框架在项目pom.xml文件中对应的依赖项为:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId></dependency>ActiveMQ实现异步消息(2)配置代理地址在项目perties文件中配置ActiveMQ消息代理的地址:spring.activemq.broker-url=tcp://localhost:61616这个地址及端口号是ActiveMQ默认的,一般不要改变。ActiveMQ实现异步消息packagecom.example.activesender.entity;
importlombok.Data;importorg.springframework.jms.core.MessageCreator;
importjavax.jms.JMSException;importjavax.jms.Message;importjavax.jms.Session;
@DatapublicclassMsgimplementsMessageCreator{ privateStringtext;
@Override publicMessagecreateMessage(Sessionsession)throwsJMSException{ returnsession.createTextMessage(this.text); }}(3)定义消息实体基于JMS规范的消息实体需实现MessageCreator接口,并重写其createMessage方法。在项目工程目录树的com.example.activesender节点下创建entity包,其中创建消息实体类Msg.java,代码如下:ActiveMQ实现异步消息(4)开发控制器在控制器中用SpringBoot配置好的JmsTemplate模板向ActiveMQ发消息。在项目工程目录树的com.example.activesender节点下创建controller包,其中创建控制器类SendController.java,代码如下:packagecom.example.activesender.controller;
importcom.example.activesender.entity.Msg;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jms.core.JmsTemplate;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.RequestMapping;
@Controller@RequestMapping("msg")publicclassSendController{ @AutowiredJmsTemplatejmsTemplate; //注入JmsTemplate模板
@RequestMapping("/input") publicStringsendMsg(Modelmodel,Msgmsg){ if(msg.getText()!=null&&msg.getText()!=""){jmsTemplate.send("商品促销通知",msg); }model.addAttribute("msg",msg); return"input"; }}ActiveMQ实现异步消息(5)前端页面在项目工程目录树的src→main→resources→templates下创建前端页面input.html,代码为:<!DOCTYPEhtml><htmllang="en"xmlns:th=""><head><metacharset="UTF-8"><title>消息录入</title></head><bodybgcolor="#e0ffff"><br><formth:action="@{/msg/input}"th:object="${msg}"method="post"><inputth:type="text"th:field="*{text}"th:placeholder="请输入消息内容"/><inputth:type="submit"value="发送"></form><br><pth:text="'您编辑的内容【'+${msg.text}+'】已发送至ActiveMQ保存。'"th:if="${msg.text!=null&&msg.text!=''}"/></body></html>ActiveMQ实现异步消息(6)运行确保已经启动了ActiveMQ。启动项目,打开浏览器,在地址栏输入http://localhost:8080/msg/input回车,显示页面如图8.12所示。ActiveMQ实现异步消息在文本框中输入消息内容,点“发送”按钮,下面显示文字提示消息已被发送至ActiveMQ。此时,查看ActiveMQ的队列,可看到保存在其中的消息条目,如图8.13所示。ActiveMQ实现异步消息消息条目各字段的含义如图8.14所示,其中,“NumberOfPendingMessages”是等待接收者接收的消息数,当前为1条;“NumberOfConsumers”是消费者,也就是接收者的个数,由于当前尚未有接收者程序在运行,故个数显示为0;“MessagesEnqueued”是进入队列的消息数,为1条;“MessagesDequeued”表示移出队列的消息数,由于队列中的这条消息还未被任何接收者接收,故暂时不能移出队列,值为0。ActiveMQ实现异步消息3.接收者程序要进一步测试消息的接收过程,必须要有个接收者程序,步骤如下。(1)创建项目创建SpringBoot项目,项目名为ActiveReceiver,在出现的向导界面“Dependencies”列表中勾选SpringBoot基本框架(“Web”→“SpringWeb”)、Thymeleaf引擎组件(“TemplateEngines”→“Thymeleaf”)、SpringActiveMQ框架(“Messaging”→“SpringforApacheActiveMQ5”)。(2)配置代理地址与发送者程序的配置完全一样,在项目perties文件中配置:spring.activemq.broker-url=tcp://localhost:61616ActiveMQ实现异步消息(3)开发接收器接收器作为一个组件(以@Component注解),监听和接收来自消息代理(ActiveMQ)特定目的地队列中的消息。在项目工程目录树的com.example.activereceiver节点下创建component包,其中创建接收器类Receiver.java,代码如下:packageponent;
importorg.springframework.jms.annotation.JmsListener;importorg.springframework.stereotype.Component;
@ComponentpublicclassReceiver{ privateStringtext; //存储消息内容
@JmsListener(destination="商品促销通知") publicvoidreceiveMsg(Stringmessage){this.text=message; }
publicStringgetText(){ returnthis.text; }}ActiveMQ实现异步消息(4)开发控制器在控制器中注入接收器,将接收到的消息内容发往前端页面。在项目工程目录树的com.example.activereceiver节点下创建controller包,其中创建控制器类ReceiveController.java,代码如下:packagecom.example.activereceiver.controller;
importponent.Receiver;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.RequestMapping;
@Controller@RequestMapping("msg")publicclassReceiveController{ @AutowiredReceiverreceiver; //注入接收器
@RequestMapping("/show") publicStringshowMsg(Modelmodel){model.addAttribute("text",receiver.getText());//获取接收器中的消息内容 return"show"; }}ActiveMQ实现异步消息(5)前端页面在项目工程目录树的src→main→resources→templates下创建前端页面show.html,代码为:<!DOCTYPEhtml><htmllang="en"xmlns:th=""><head><metacharset="UTF-8"><title>消息显示</title></head><bodybgcolor="#e0ffff"><br><pth:text="'收到来自ActiveMQ的消息【'+${text}+'】。'"th:if="${text!=null&&text!=''}"/></body></html>ActiveMQ实现异步消息(6)运行确保ActiveMQ已经启动运行。启动项目,打开浏览器,在地址栏输入http://localhost:8080/msg/show回车,显示页面如图8.15所示。此时,查看ActiveMQ的队列,看到消息条目中各字段的值已经发生了改变,如图8.16所示。目录03RabbitMQ实现异步消息1.RabbitMQ安装使用2.发送者程序3.接收者程序RabbitMQ实现异步消息【实例8.2】用RabbitMQ作为消息中间件,实现与【实例8.2】同样的异步消息收发功能。1.RabbitMQ安装使用RabbitMQ是流行的开源消息队列系统,用Erlang语言开发,故要使用它必须先安装Erlang。1)安装Erlang(1)下载ErlangErlang下载地址为/downloads,下载得到可执行程序安装包otp_win64_24.0.exe。(2)安装Erlang双击安装包文件otp_win64_24.0.exe,启动安装向导,选择要安装的组件,这里采用默认选项,如图8.17所示。RabbitMQ实现异步消息单击“Next”按钮,指定安装路径,笔者安装到C:\ProgramFiles\erl-24.0,如图8.18所示。RabbitMQ实现异步消息(3)配置环境变量安装完后需要为Erlang配置环境变量,这样后面安装的RabbitMQ才能找到并借助Erlang运行。在计算机操作系统中右击“此电脑”→“属性”→“高级系统设置”,打开“系统属性”对话框,点“环境变量”按钮,打开“环境变量”对话框。新建一个系统变量ERLANG_HOME,变量值设为Erlang的安装路径,如图8.19所示。RabbitMQ实现异步消息然后编辑Path系统变量,添加上Erlang的条目“%ERLANG_HOME%\bin”,如图8.20所示。RabbitMQ实现异步消息(4)安装RabbitMQ-Plugins插件这个插件实际上就是一个管理界面,方便用户在浏览器中可视化地查看RabbitMQ各个消息队列的工作情况。打开Windows命令行,输入:rabbitmq-pluginsenablerabbitmq_management运行状态如图8.25所示,表示安装成功。RabbitMQ实现异步消息(5)将RabbitMQ启动为Windows服务以管理员身份进入Windows命令行,输入:netstartRabbitMQ回车后出现提示信息“请求的服务已经启动。...”表示成功了,如图8.26所示。RabbitMQ实现异步消息在计算机操作系统中右击“此电脑”→“管理”,打开“计算机管理”窗口,在“服务和应用程序”→“服务”页列表中可找到一个名为“RabbitMQ”的服务,这个就是RabbitMQ所对应的Windows服务,如图8.27所示。RabbitMQ实现异步消息(6)测试安装以管理员身份打开Windows命令行,输入rabbitmqctlstatus如果出现如图8.28所示的状态信息,无报错,就说明安装是成功的,并且说明现在RabbitMQ服务运行正常。RabbitMQ实现异步消息3)使用RabbitMQ(1)访问RabbitMQ打开浏览器,地址栏输入http://localhost:15672回车,出现登录界面如图8.29所示。RabbitMQ实现异步消息输入用户名密码(默认都是guest),点“Login”按钮进入RabbitMQ的管理页面,如图8.30所示。RabbitMQ实现异步消息(2)查看消息队列点击管理页面导航栏上的“Queues”项,转至队列查看页面,如图8.31所示。RabbitMQ实现异步消息2.发送者程序先来开发发送者程序,步骤如下。(1)创建项目创建SpringBoot项目,项目名为RabbitSender,在出现的向导界面“Dependencies”列表中勾选SpringBoot基本框架(“Web”→“SpringWeb”)、Thymeleaf引擎组件(“TemplateEngines”→“Thymeleaf”)、Lombok模型简化组件(“DeveloperTools”→“Lombok”)。为使项目支持RabbitMQ,最重要的是添加SpringRabbitMQ框架,勾选“Messaging”→“SpringforRabbitMQ”,如图8.32所示。添加的SpringRabbitMQ框架在项目pom.xml文件中对应的依赖项为:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>RabbitMQ实现异步消息RabbitMQ实现异步消息(2)定义消息实体与JMS不同,AMQP规范对消息实体并无特别的要求,直接写一个简单的模型类即可。在项目工程目录树的com.example.rabbitsender节点下创建entity包,其中创建消息实体类Msg.java,代码如下:packagecom.example.rabbitsender.entity;
importlombok.Data;
@DatapublicclassMsg{ privateStringtext;}(3)开发控制器在控制器中用SpringBoot配置好的RabbitTemplate模板向RabbitMQ发消息。在项目工程目录树的com.example.rabbitsender节点下创建controller包,其中创建控制器类SendController.java,代码显示。RabbitMQ实现异步消息(4)前端页面在项目工程目录树的src→main→resources→templates下创建前端页面input.html,代码为:<!DOCTYPEhtml><htmllang="en"xmlns:th=""><head><metacharset="UTF-8"><title>消息录入</title></head><bodybgcolor="#e0ffff"><br><formth:action="@{/msg/input}"th:object="${msg}"method="post"><inputth:type="text"th:field="*{text}"th:placeholder="请输入消息内容"/><inputth:type="submit"value="发送"></form><br><pth:text="'您编辑的内容【'+${msg.text}+'】已发送至RabbitMQ保存。'"th:if="${msg.text!=null&&msg.text!=''}"/></body></html>RabbitMQ实现异步消息(5)运行启动项目,打开浏览器,在地址栏输入http://localhost:8080/msg/input回车,显示页面如图8.33所示。RabbitMQ实现异步消息在文本框中输入消息内容,点“发送”按钮,下面显示文字提示消息已被发送至RabbitMQ。此时,查看RabbitMQ的队列,可看到保存在其中的消息条目,如图8.34所示。RabbitMQ实现异步消息3.接收者程序接下来继续开发接收者程序,步骤如下。(1)创建项目创建SpringBoot项目,项目名为RabbitReceiver,在出现的向导界面“Dependencies”列表中勾选SpringBoot基本框架(“Web”→“SpringWeb”)、Thymeleaf引擎组件(“TemplateEngines”→“Thymeleaf”)、SpringRabbitMQ框架(“Messaging”→“SpringforRabbitMQ”)。(2)开发接收器接收器同样作为一个组件(@Component注解),监听和接收来自消息代理(RabbitMQ)特定目的地队列中的消息。RabbitMQ实现异步消息在项目工程目录树的com.example.rabbitreceiver节点下创建component包,其中创建接收器类Receiver.java,代码如下:packageponent;
importorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.stereotype.Component;
@ComponentpublicclassReceiver{privateStringtext; //存储消息内容
@RabbitListener(queues="商品促销通知") publicvoidreceiveMsg(Stringmessage){this.text=message; }
publicStringgetText(){ returnthis.text; }}RabbitMQ实现异步消息(3)开发控制器在控制器中注入接收器,将接收到的消息内容发往前端页面。在项目工程目录树的com.example.rabbitreceiver节点下创建controller包,其中创建控制器类ReceiveController.java,代码如下:packagecom.example.rabbitreceiver.controller;
importponent.Receiver;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.RequestMapping;
@Controller@RequestMapping("msg")publicclassReceiveController{ @AutowiredReceiverreceiver; //注入接收器
@RequestMapping("/show") publicStringshowMsg(Modelmodel){model.addAttribute("text",receiver.getText()); //获取接收器中的消息内容 return"show"; }}RabbitMQ实现异步消息(4)前端页面在项目工程目录树的src→main→resources→templates下创建前端页面show.html,代码为:<!DOCTYPEhtml><htmllang="en"xmlns:th=""><head><metacharset="UTF-8"><title>消息显示</title></head><bodybgcolor="#e0ffff"><br><pth:text="'收到来自RabbitMQ的消息【'+${text}+'】。'"th:if="${text!=null&&text!=''}"/></body></html>RabbitMQ实现异步消息(5)运行启动项目,打开浏览器,在地址栏输入http://localhost:8080/msg/show回车,显示页面如图8.35所示。RabbitMQ实现异步消息此时,查看RabbitMQ的队列,看到消息条目中各字段的值已经发生了改变,如图8.36所示。第8章SpringBoot其他功能——WebFlux响应式编程初步SpringBoot实用教程(第4版)目录01响应式编程概述1.需求场景2.Reactor模式3.WebFlux框架4.开发方式5.数据库选择响应式编程概述
1.需求场景目前,在SpringBoot所集成的Web核心编程框架(也就是本书前面所有实例在创建项目时所勾选的SpringBoot基本框架“Web”→“SpringWeb”)内部是基于单线程阻塞机制工作的,其基本工作模式为:主线程接受用户请求→执行任务(包括操作后台、处理数据...)→包装数据、向前端返回响应。这种模式在通常绝大多数的应用场景下都能够工作得很好,但若遇到高并发请求耗时任务的情形却难以胜任,例如,短时间内有大量用户同时向同一个服务器线程发起请求,而它们要服务器完成的又都是需要耗费比较长时间的任务,服务器只能先处理完第1个用户的任务并返回响应后,再接着继续接下一个用户的任务,但网络所允许的最长响应时间是有限度的,故服务器只能在其最大负载能力范围内满足有限数量用户的请求,更多的请求由于来不及处理将直接被拒绝,使得网页长时间停滞无刷新也无法操作,这会影响到用户的使用体验。响应式编程就是针对上述问题而提出的一种新的编程模式,它的工作过程为:主线程接受用户请求→立刻返回响应(响应中不包含处理的数据结果,只是告知用户请求已受理,请等待)→开启一个新的工作线程去执行任务(包括操作后台、处理数据...)→工作线程完成任务→包装结果数据返回给前端。响应式编程概述2.Reactor模式响应式编程的工作模式被称为Reactor(反应器),其原理模型如图8.37所示。响应式编程概述该模型涉及客户端、分发器、处理器三方。(1)(2)(3)客户端会先向服务器注册其感兴趣的事件(即“订阅”事件),这些事件并不会给服务器发送请求,只有当客户端发生了相应的注册事件时,才会触发服务器的响应。服务器上存在一个分发器线程,这个线程只是负责轮询客户端的事件而并不处理具体的请求,当它监测到有客户端事件发生时,会将事件对应的请求分发给匹配的处理器,然后启用另外一条线程运行处理器。当处理器处理完请求的业务时,再将结果转换为数据流返回给客户端。响应式编程概述3.WebFlux框架与SpringBoot基本框架使用的DispatcherServlet不同,WebFlux使用WebHandler接口,并通过该接口的实现类DispatcherHandler实现了上述模型中分发器的功能,如图8.38所示。响应式编程概述4.开发方式在SpringBoot中,响应式编程存在两种不同的开发方式:一种是路由函数式;另一种是MVC注解式。这种方式需要先创建一个Handler类,它相当于MVC控制器中的方法体,不过此时的请求/响应不再是HttpServletRequest/HttpServletResponse,而变成了ServerRequest/ServerResponse。(1)路由函数式采用大家所熟悉的注解编程,以@Controller/@RestController来代替Handler类,URL路径映射也通过@RequestMapping提供,只是在创建项目时要额外添加WebFlux响应式框架,以及要注意控制器的返回类型必须是Flux或Mono格式的数据流。(2)MVC注解式响应式编程概述5.数据库选择WebFlux只能支持SpringDataReactive,它是一种非阻塞的数据响应方式,但传统关系数据库的开发却是阻塞的,所以SpringDataReactive并不能对关系数据库的开发给予有效支持,但它仍然可以支持Redis、MongoDB等NoSQL的开发,而Redis功能有限,更适合作为缓存使用,于是MongoDB就成为了WebFlux最理想的数据源,以响应式Web程序访问MongoDB也是当前应用最广泛的方式。目录02响应式编程举例1.准备数据2.创建项目3.配置连接4.开发模型5.开发持久层6.开发业务层7.编写控制器8.启用响应式接口9.运行响应式编程举例【实例8.3】用WebFlux编程操作MongoDB,读取保存在其中的一条或多条销售详情记录。1.准备数据MongoDB数据库中的数据情况如图8.39所示。响应式编程举例2.创建项目创建SpringBoot项目,项目名为WebFluxMongo,在出现的向导界面“Dependencies”列表中勾选Lombok模型简化组件(“DeveloperTools”→“Lombok”)、JPA框架(“SQL”→“SpringDataJPA”)。为使项目支持操作MongoDB的响应式编程,最重要的是添加WebFlux框架与MongoDB响应式数据源,操作如下。(1)添加WebFlux框架勾选“Web”→“SpringReactiveWeb”。(2)添加MongoDB响应式数据源勾选“NoSQL”→“SpringDataReactiveMongoDB”。以上这两者在项目pom.xml文件中对应的依赖项如下:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb-reactive</artifactId></dependency> <!--MongoDB响应式数据源--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency> <!--WebFlux框架-->响应式编程举例3.配置连接在项目perties文件中配置MongoDB的数据库连接,配置内容如下:spring.data.mongodb.host=localhostspring.data.mongodb.port=27017spring.data.mongodb.database=mgnetshop
spring.jackson.serialization.indent-output=true4.开发模型由于本例与【实例5.7】一样操作的是MongoDB数据库中的销售详情记录,故采用一模一样的模型类。直接复用【实例5.7】的两个模型类,将model包及其下模型类复制到本项目的包下,改包路径与当前的项目一致即可,代码略。响应式编程举例5.开发持久层WebFlux框架为基于MongoDB的响应式编程提供了ReactiveMongoRepository接口,通过继承它来开发持久层的数据接口,这也是一种JPA类型的接口。在项目工程目录树的com.example.webfluxmongo节点下创建repository包,其中创建接口SaleRepository.java,定义代码为:packagecom.example.webfluxmongo.repository;
importcom.example.webfluxmongo.model.Saledetail;importorg.springframework.data.mongodb.repository.ReactiveMongoRepository;importorg.springframework.stereotype.Repository;importreactor.core.publisher.Flux;importreactor.core.publisher.Mono;
@RepositorypublicinterfaceSaleRepositoryextendsReactiveMongoRepository<Saledetail,String> { Mono<Saledetail>querySaledetailsByOidAndPid(intoid,intpid); Flux<Saledetail>findByScodeLike(Stringscode);}响应式编程举例6.开发业务层下面基于WebFlux的JPA接口来开发操作MongoDB的业务层(1)定义业务接口在项目工程目录树的com.example.webfluxmongo节点下创建service包,其下定义名为SaleService的接口,代码为:packagecom.example.webfluxmongo.service;
importcom.example.webfluxmongo.model.Saledetail;importreactor.core.publisher.Flux;importreactor.core.publisher.Mono;
publicinterfaceSaleService{ //查询单条记录 publicMono<Saledetail>getSale(intoid,intpid);
//查询多条记录 publicFlux<Saledetail>findSales(Stringscode);}响应式编程举例(2)开发服务实体在service包下创建业务接口的实现类SaleServiceImpl,代码如下:packagecom.example.webfluxmongo.service;
importcom.example.webfluxmongo.model.Saledetail;importcom.examp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五电影制作保密合同范本6篇
- 二零二五版木材行业碳排放权交易合同范本8篇
- 2025年个人住宅房产抵押担保合同范本
- 课题申报参考:内感受干预促进青少年情绪能力的神经基础
- 课题申报参考:民事诉讼法的基础理论和基本制度研究
- 2025年度住宅小区停车位共有产权转让合同范本
- 2025年个人房产继承权转让合同范本2篇
- 2025版农机具租赁与智能灌溉系统合同4篇
- 二零二五版美容美发院加盟店会员管理与服务合同4篇
- 2025年度高端建筑用热镀锌钢管采购合同3篇
- DB43-T 3022-2024黄柏栽培技术规程
- 成人失禁相关性皮炎的预防与护理
- 九宫数独200题(附答案全)
- 人员密集场所消防安全管理培训
- 《聚焦客户创造价值》课件
- PTW-UNIDOS-E-放射剂量仪中文说明书
- JCT587-2012 玻璃纤维缠绕增强热固性树脂耐腐蚀立式贮罐
- 保险学(第五版)课件全套 魏华林 第0-18章 绪论、风险与保险- 保险市场监管、附章:社会保险
- 典范英语2b课文电子书
- 员工信息登记表(标准版)
- 春节工地停工复工计划安排( 共10篇)
评论
0/150
提交评论