(需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试
生活随笔
收集整理的這篇文章主要介紹了
(需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
接上一篇:(企業(yè)內(nèi)部需求實(shí)戰(zhàn)_進(jìn)階_01)SSM集成RabbitMQ 關(guān)鍵代碼講解、開發(fā)、測(cè)試
https://gblfy.blog.csdn.net/article/details/104197309
文章目錄
- 一、RabbitMQ配置文件
- 1. RabbitMQ生產(chǎn)者配置文件
- 2. RabbitMQ消費(fèi)者配置文件
- 3. 連接配置文件
- 二、生產(chǎn)者Java代碼Conding
- 2.1. 生產(chǎn)者代碼①
- 2.2. 生產(chǎn)者代碼②
- 三、消費(fèi)者Java代碼Conding
- 3.1. 生產(chǎn)者代碼①
- 3.2. 生產(chǎn)者代碼②
- 四、項(xiàng)目準(zhǔn)備
- 4.1. 啟動(dòng)項(xiàng)目
- 4.2. 清空控制臺(tái)
- 五、管控臺(tái) 隊(duì)列綁定交換機(jī)
- 5.1. 啟動(dòng) RabbitMQ
- 5.2. 管控臺(tái)總覽
- 5.3. 隊(duì)列①綁定
- 5.4. 隊(duì)列②綁定
- 六、管控臺(tái)綁定后縱覽
- 6.1. 在交換機(jī)菜單查看 綁定后的隊(duì)列
- 6.2. 在隊(duì)列①菜單中 查看 綁定后的交換機(jī)
- 6.3. 在隊(duì)列②菜單中 查看 綁定后的交換機(jī)
- 七、生產(chǎn)者請(qǐng)求測(cè)試
- 7.1. 生產(chǎn)者①請(qǐng)求
- 7.2. 生產(chǎn)者②請(qǐng)求
- 7.3. 消費(fèi)者①請(qǐng)求
- 7.4. 消費(fèi)者②請(qǐng)求
一、RabbitMQ配置文件
1. RabbitMQ生產(chǎn)者配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:rabbit="http://www.springframework.org/schema/rabbit"xsi:schemaLocation="http://www.springframework.org/schema/rabbithttp://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd"><!--生產(chǎn)者者配置如下:--><!-- 定義RabbitMQ的連接工廠 --><rabbit:connection-factory id="connectionFactory"host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}"password="${rabbitmq.password}" virtual-host="${rabbitmq.vhost}"/><!-- 管理消息隊(duì)列 --><rabbit:admin connection-factory="connectionFactory"/><!-- 定義交換機(jī) 自動(dòng)聲明--><rabbit:direct-exchange name="ORDER-TRACE-EXCHANGE"auto-declare="true" durable="true"/><!-- 定義MQ消息模板 --><rabbit:template id="rabbitTemplate"connection-factory="connectionFactory" exchange="ORDER-TRACE-EXCHANGE"/> </beans>2. RabbitMQ消費(fèi)者配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:rabbit="http://www.springframework.org/schema/rabbit"xsi:schemaLocation="http://www.springframework.org/schema/rabbithttp://www.springframework.org/schema/rabbit/spring-rabbit-1.4.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.1.xsd"><!--消費(fèi)者配置如下:--><!-- 定義RabbitMQ的連接工廠 --><rabbit:connection-factory id="connectionFactory"host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}"password="${rabbitmq.password}" virtual-host="${rabbitmq.vhost}"/><!-- 管理消息隊(duì)列 --><rabbit:admin connection-factory="connectionFactory"/><!-- 定義一個(gè)隊(duì)列或者多個(gè)隊(duì)列 --><rabbit:queue name="FIS-TRACE-QUEUE" auto-declare="true" durable="true"/><rabbit:queue name="FIS-TRACE-MONITOR-QUEUE" auto-declare="true" durable="true"/><rabbit:queue name="ORDER-MENU-CATEGORY-QUEUE" auto-declare="true" durable="true"/><!-- 聲明多個(gè)消費(fèi)者對(duì)象 --><bean id="fisMQMsgHandler" class="com.gblfy.order.mqhandler.FisMQMsgHandler"/><bean id="fisMQMonitorMsgHandler" class="com.gblfy.order.mqhandler.FisMQMonitorMsgHandler"/><bean id="mQSimpleMsgHandler" class="com.gblfy.order.mqhandler.MQSimpleMsgHandler"/><!-- 監(jiān)聽隊(duì)列 --><rabbit:listener-container connection-factory="connectionFactory"><rabbit:listener ref="fisMQMsgHandler" method="execute" queue-names="FIS-TRACE-QUEUE"/><rabbit:listener ref="fisMQMonitorMsgHandler" method="onMessage" queue-names="FIS-TRACE-MONITOR-QUEUE"/><rabbit:listener ref="mQSimpleMsgHandler" method="execute" queue-names="ORDER-MENU-CATEGORY-QUEUE"/></rabbit:listener-container> </beans>3. 連接配置文件
rabbitmq.host=127.0.0.1 rabbitmq.port=5672 rabbitmq.username=admin rabbitmq.password=admin rabbitmq.vhost=/admin二、生產(chǎn)者Java代碼Conding
此次案例:主要演示對(duì)MQ消息的兩種不同方式。
有2個(gè)生產(chǎn)者和2個(gè)消費(fèi)者,2個(gè)隊(duì)列分別對(duì)應(yīng)一個(gè)交換機(jī),路由key和隊(duì)列名稱不一樣,消費(fèi)者處理MQ的消息的2種不同步處理方法而已!
2.1. 生產(chǎn)者代碼①
package com.gblfy.order.controller;import com.gblfy.order.pojo.FisCallingTrace; import com.gblfy.order.utils.MQSendMsgUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody;import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID;@Controller @Slf4j public class FisSendMQControllor {public static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");// 日期格式public static final DateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");// 日期格式@Autowiredprivate MQSendMsgUtils mqSendMsgUtils;/*** 發(fā)送軌跡數(shù)據(jù) MQ異步存儲(chǔ)軌跡** @return*/@RequestMapping(value = "/sendMQObjMsg", method = RequestMethod.GET)@ResponseBodypublic String sendObj() throws Exception {Date tStartDate = new Date();// 記錄轉(zhuǎn)發(fā)結(jié)束時(shí)間Date tEndDate = new Date();// 記錄轉(zhuǎn)發(fā)結(jié)束時(shí)間//模擬請(qǐng)求和響應(yīng)報(bào)文String reqXml = "my name is reqXml";String resXml = "my name is resXml";String uuid = UUID.randomUUID().toString();//模擬 軌跡儲(chǔ)存數(shù)據(jù)FisCallingTrace mFisCallingTrace = new FisCallingTrace().builder().servicename("myServiceNme is A").servicetype("2").interfacetype("2").resstatus("1").resremark("1").reqdate(dateFormat.parse(dateFormat.format(tStartDate))).reqtime(timeFormat.format(tStartDate)).resdate(dateFormat.parse(dateFormat.format(tEndDate))).restime(timeFormat.format(tEndDate)).reqxml("").resxml("").build();//定義路由routingKeyString routingKey = "trace";//調(diào)用MQ松松消息公共方法mqSendMsgUtils.sendMsg(mFisCallingTrace, routingKey, reqXml, resXml, uuid);return "send sendMQObjMsg success !!!";} }2.2. 生產(chǎn)者代碼②
package com.gblfy.order.controller;import com.gblfy.order.pojo.FisCallingTrace; import com.gblfy.order.utils.MQSendMsgUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody;import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID;@Controller @Slf4j public class FisSendMQMsgControllor {public static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");// 日期格式public static final DateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");// 日期格式@Autowiredprivate MQSendMsgUtils mqSendMsgUtils;/*** 發(fā)送軌跡數(shù)據(jù) MQ異步存儲(chǔ)軌跡** @return*/@RequestMapping(value = "/sendMQObjMsg2", method = RequestMethod.GET)@ResponseBodypublic String sendObj() throws Exception {Date tStartDate = new Date();// 記錄轉(zhuǎn)發(fā)結(jié)束時(shí)間Date tEndDate = new Date();// 記錄轉(zhuǎn)發(fā)結(jié)束時(shí)間//模擬請(qǐng)求和響應(yīng)報(bào)文String reqXml = "my name is reqXml";String resXml = "my name is resXml";String uuid = UUID.randomUUID().toString();//模擬 軌跡儲(chǔ)存數(shù)據(jù)FisCallingTrace mFisCallingTrace = new FisCallingTrace().builder().servicename("myServiceNme is A").servicetype("2").interfacetype("2").resstatus("1").resremark("1").reqdate(dateFormat.parse(dateFormat.format(tStartDate))).reqtime(timeFormat.format(tStartDate)).resdate(dateFormat.parse(dateFormat.format(tEndDate))).restime(timeFormat.format(tEndDate)).reqxml("").resxml("").build();//定義路由routingKeyString routingKey = "trace2";//調(diào)用MQ松松消息公共方法mqSendMsgUtils.sendMsg(mFisCallingTrace, routingKey, reqXml, resXml, uuid);return "send sendMQObjMsg success !!!";} }三、消費(fèi)者Java代碼Conding
3.1. 生產(chǎn)者代碼①
package com.gblfy.order.mqhandler;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.gblfy.order.pojo.FisCallingTrace; import com.gblfy.order.pojo.RequestInfo; import lombok.extern.slf4j.Slf4j;@Slf4j public class FisMQMsgHandler {/*** 接收MQ消息,保存軌跡** @param msg*/public void execute(String msg) {try {//通過(guò) 判斷路由routingKey是否等于trace相同即可//fastjson解析MQ接收的json字符串 轉(zhuǎn)換成RequestInfo對(duì)象JSONObject jsonObject = JSON.parseObject(msg);RequestInfo requestInfo = JSON.toJavaObject(jsonObject, RequestInfo.class);log.info("請(qǐng)求報(bào)文 mReqXml:" + requestInfo.getMReqXml());log.info("響應(yīng)報(bào)文 mResXml:" + requestInfo.getMResXml());log.info("接口名稱 serviceName:" + requestInfo.getServiceName());log.info("路由routingKey:" + requestInfo.getType());log.info("生成的 mUUID:" + requestInfo.getMUUID());/*** 1.從requestInfo對(duì)象中,獲取fisCallingTrace軌跡對(duì)象* 2.請(qǐng)求報(bào)文和響應(yīng)報(bào)文需要添加進(jìn)去 fisCallingTrace對(duì)象中的請(qǐng)求報(bào)文和響應(yīng)報(bào)文默認(rèn)是空字符串* 3.將fisCallingTrace 軌技數(shù)據(jù)保存數(shù)據(jù)庫(kù)*/FisCallingTrace fisCallingTrace = requestInfo.getFisCallingTrace();fisCallingTrace.setTraceId(requestInfo.getMUUID());fisCallingTrace.setReqxml(requestInfo.getMReqXml());fisCallingTrace.setResxml(requestInfo.getMResXml());log.info("從MQ接收消息并封裝完成!!!");log.info("開始進(jìn)行插入數(shù)據(jù)庫(kù)操作!!!");//把MQ接收消息的數(shù)據(jù)進(jìn)行 保存軌跡數(shù)據(jù)庫(kù)操作 todo//注入mqpper 插入數(shù)據(jù)庫(kù) todo} catch (Exception e) {log.info("如果對(duì)象中沒有,指定的元素,一般會(huì)導(dǎo)致空指針異常!!!");e.printStackTrace();}} }3.2. 生產(chǎn)者代碼②
package com.gblfy.order.mqhandler;import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j;@Slf4j public class MQSimpleMsgHandler {private static final ObjectMapper MAPPER = new ObjectMapper();/*** 接收MQ消息** @param msg*/public void execute(String msg) {try {JsonNode jsonNode = MAPPER.readTree(msg);String serviceName = jsonNode.get("serviceName").asText();String routingKey = jsonNode.get("routingKey").asText();String currentDate = jsonNode.get("currentDate").asText();log.info("接口名稱:" + serviceName);log.info("路由routingKey:" + routingKey);log.info("當(dāng)前時(shí)間:" + currentDate);} catch (Exception e) {e.printStackTrace();}} }四、項(xiàng)目準(zhǔn)備
4.1. 啟動(dòng)項(xiàng)目
4.2. 清空控制臺(tái)
五、管控臺(tái) 隊(duì)列綁定交換機(jī)
5.1. 啟動(dòng) RabbitMQ
雙擊運(yùn)行
5.2. 管控臺(tái)總覽
5.3. 隊(duì)列①綁定
5.4. 隊(duì)列②綁定
六、管控臺(tái)綁定后縱覽
6.1. 在交換機(jī)菜單查看 綁定后的隊(duì)列
6.2. 在隊(duì)列①菜單中 查看 綁定后的交換機(jī)
6.3. 在隊(duì)列②菜單中 查看 綁定后的交換機(jī)
七、生產(chǎn)者請(qǐng)求測(cè)試
7.1. 生產(chǎn)者①請(qǐng)求
7.2. 生產(chǎn)者②請(qǐng)求
其他和生產(chǎn)①一樣的,知識(shí)路由key值不一樣
7.3. 消費(fèi)者①請(qǐng)求
7.4. 消費(fèi)者②請(qǐng)求
總結(jié)
以上是生活随笔為你收集整理的(需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring Boot整合swagger
- 下一篇: GitHub下载文件时缓慢的问题