日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

(需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试

發(fā)布時(shí)間:2024/9/27 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (需求实战_进阶_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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。