(需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试
生活随笔
收集整理的這篇文章主要介紹了
(需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
接上一篇:(企業內部需求實戰_進階_01)SSM集成RabbitMQ 關鍵代碼講解、開發、測試
https://gblfy.blog.csdn.net/article/details/104197309
文章目錄
- 一、RabbitMQ配置文件
- 1. RabbitMQ生產者配置文件
- 2. RabbitMQ消費者配置文件
- 3. 連接配置文件
- 二、生產者Java代碼Conding
- 2.1. 生產者代碼①
- 2.2. 生產者代碼②
- 三、消費者Java代碼Conding
- 3.1. 生產者代碼①
- 3.2. 生產者代碼②
- 四、項目準備
- 4.1. 啟動項目
- 4.2. 清空控制臺
- 五、管控臺 隊列綁定交換機
- 5.1. 啟動 RabbitMQ
- 5.2. 管控臺總覽
- 5.3. 隊列①綁定
- 5.4. 隊列②綁定
- 六、管控臺綁定后縱覽
- 6.1. 在交換機菜單查看 綁定后的隊列
- 6.2. 在隊列①菜單中 查看 綁定后的交換機
- 6.3. 在隊列②菜單中 查看 綁定后的交換機
- 七、生產者請求測試
- 7.1. 生產者①請求
- 7.2. 生產者②請求
- 7.3. 消費者①請求
- 7.4. 消費者②請求
一、RabbitMQ配置文件
1. RabbitMQ生產者配置文件
<?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"><!--生產者者配置如下:--><!-- 定義RabbitMQ的連接工廠 --><rabbit:connection-factory id="connectionFactory"host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}"password="${rabbitmq.password}" virtual-host="${rabbitmq.vhost}"/><!-- 管理消息隊列 --><rabbit:admin connection-factory="connectionFactory"/><!-- 定義交換機 自動聲明--><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消費者配置文件
<?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"><!--消費者配置如下:--><!-- 定義RabbitMQ的連接工廠 --><rabbit:connection-factory id="connectionFactory"host="${rabbitmq.host}" port="${rabbitmq.port}" username="${rabbitmq.username}"password="${rabbitmq.password}" virtual-host="${rabbitmq.vhost}"/><!-- 管理消息隊列 --><rabbit:admin connection-factory="connectionFactory"/><!-- 定義一個隊列或者多個隊列 --><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"/><!-- 聲明多個消費者對象 --><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"/><!-- 監聽隊列 --><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二、生產者Java代碼Conding
此次案例:主要演示對MQ消息的兩種不同方式。
有2個生產者和2個消費者,2個隊列分別對應一個交換機,路由key和隊列名稱不一樣,消費者處理MQ的消息的2種不同步處理方法而已!
2.1. 生產者代碼①
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;/*** 發送軌跡數據 MQ異步存儲軌跡** @return*/@RequestMapping(value = "/sendMQObjMsg", method = RequestMethod.GET)@ResponseBodypublic String sendObj() throws Exception {Date tStartDate = new Date();// 記錄轉發結束時間Date tEndDate = new Date();// 記錄轉發結束時間//模擬請求和響應報文String reqXml = "my name is reqXml";String resXml = "my name is resXml";String uuid = UUID.randomUUID().toString();//模擬 軌跡儲存數據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";//調用MQ松松消息公共方法mqSendMsgUtils.sendMsg(mFisCallingTrace, routingKey, reqXml, resXml, uuid);return "send sendMQObjMsg success !!!";} }2.2. 生產者代碼②
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;/*** 發送軌跡數據 MQ異步存儲軌跡** @return*/@RequestMapping(value = "/sendMQObjMsg2", method = RequestMethod.GET)@ResponseBodypublic String sendObj() throws Exception {Date tStartDate = new Date();// 記錄轉發結束時間Date tEndDate = new Date();// 記錄轉發結束時間//模擬請求和響應報文String reqXml = "my name is reqXml";String resXml = "my name is resXml";String uuid = UUID.randomUUID().toString();//模擬 軌跡儲存數據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";//調用MQ松松消息公共方法mqSendMsgUtils.sendMsg(mFisCallingTrace, routingKey, reqXml, resXml, uuid);return "send sendMQObjMsg success !!!";} }三、消費者Java代碼Conding
3.1. 生產者代碼①
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 {//通過 判斷路由routingKey是否等于trace相同即可//fastjson解析MQ接收的json字符串 轉換成RequestInfo對象JSONObject jsonObject = JSON.parseObject(msg);RequestInfo requestInfo = JSON.toJavaObject(jsonObject, RequestInfo.class);log.info("請求報文 mReqXml:" + requestInfo.getMReqXml());log.info("響應報文 mResXml:" + requestInfo.getMResXml());log.info("接口名稱 serviceName:" + requestInfo.getServiceName());log.info("路由routingKey:" + requestInfo.getType());log.info("生成的 mUUID:" + requestInfo.getMUUID());/*** 1.從requestInfo對象中,獲取fisCallingTrace軌跡對象* 2.請求報文和響應報文需要添加進去 fisCallingTrace對象中的請求報文和響應報文默認是空字符串* 3.將fisCallingTrace 軌技數據保存數據庫*/FisCallingTrace fisCallingTrace = requestInfo.getFisCallingTrace();fisCallingTrace.setTraceId(requestInfo.getMUUID());fisCallingTrace.setReqxml(requestInfo.getMReqXml());fisCallingTrace.setResxml(requestInfo.getMResXml());log.info("從MQ接收消息并封裝完成!!!");log.info("開始進行插入數據庫操作!!!");//把MQ接收消息的數據進行 保存軌跡數據庫操作 todo//注入mqpper 插入數據庫 todo} catch (Exception e) {log.info("如果對象中沒有,指定的元素,一般會導致空指針異常!!!");e.printStackTrace();}} }3.2. 生產者代碼②
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("當前時間:" + currentDate);} catch (Exception e) {e.printStackTrace();}} }四、項目準備
4.1. 啟動項目
4.2. 清空控制臺
五、管控臺 隊列綁定交換機
5.1. 啟動 RabbitMQ
雙擊運行
5.2. 管控臺總覽
5.3. 隊列①綁定
5.4. 隊列②綁定
六、管控臺綁定后縱覽
6.1. 在交換機菜單查看 綁定后的隊列
6.2. 在隊列①菜單中 查看 綁定后的交換機
6.3. 在隊列②菜單中 查看 綁定后的交換機
七、生產者請求測試
7.1. 生產者①請求
7.2. 生產者②請求
其他和生產①一樣的,知識路由key值不一樣
7.3. 消費者①請求
7.4. 消費者②請求
總結
以上是生活随笔為你收集整理的(需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解、开发、测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot整合swagger
- 下一篇: GitHub下载文件时缓慢的问题