背景:
为了减轻服务器的压力,现在原有项目的基础上集成消息队列来异步处理消息!
此项目是企业真实需求,项目的代码属于线上生产代码,直接用于生产即可!


此项目采用MQ发送消息模式为:通配符模式,如果对RabbitMQ不熟悉,请学习RabbitMQ专栏进行相关知识点的学习!遇到问题,可以给我留言!看到后定会回复!

文章目录

  • 一、RabbitMQ通配符模式快速入门
    • 重要原则
    • 1. RabbitMQ通配符模式简述
    • 2. RabbitMQ通配符模式图示
    • 3. MQ角色组成
  • 二、SSM集成RabbitMQ
    • 2.1. 引依赖
    • 2.2. 生产者配置文件
    • 2.3. 消费者配置文件
    • 2.4. 连接配置文件
    • 2.5. 生产者代码
    • 2.6 消费者 ①
    • 2.7 消费者 ②
    • 2.8 MQ工具类
  • 三、管控台队列绑定交换机
    • 3.1. 复制队列名称
    • 3.2. 队列绑定交换机
  • 四、验证测试
    • 4.1. 启动项目
    • 4.2. 清空控制台
    • 4.4. 生产者①请求
    • 4.5. 生产者②请求
  • 五、启动RabbitMQ
    • 5.1. 进入sbin目录,双击运行
    • 5.2. 启动图示

一、RabbitMQ通配符模式快速入门

重要原则

  1. RabbitMQ通配符模式:user.#user.*优先级高,如果消息.#和.*都能区配上先走.#后走.*,走.#的消息一定能走.*;走.*的不一定能走 .#
  2. 栗子:一个消息格式为:*.*.*

1. RabbitMQ通配符模式简述

Topic Exchange 将路由键和某模式进行区配。此时队列需要绑定到一个模式。符号"#"区配一个或者多个词,符号"*"只能区配一个词。因此,"audit.#"能够区配到"audit.irs.corporate",但是"audit.*"只能去配置"audit.irs"

2. RabbitMQ通配符模式图示

3. MQ角色组成

序号 说明 角色
生产者 PRODUCER
消费者 CONSUMER
消息队列 QUEUE
交换机 EXCHANGE
路由routingKey ROUTINGKEY
交换机和队列绑定 EXCHANGE和ROUTINGKEY绑定
消息区配规则 区配一个词还是多个词

二、SSM集成RabbitMQ

2.1. 引依赖

      <!--spring整合rabbitmq--><dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit</artifactId><version>1.4.0.RELEASE</version></dependency>

2.2. 生产者配置文件

<?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:topic-exchange name="ORDER-TRACE-EXCHANGE"auto-declare="true" durable="true"/><!-- 定义MQ消息模板 --><rabbit:template id="rabbitTemplate"connection-factory="connectionFactory" exchange="ORDER-TRACE-EXCHANGE"/>
</beans>

2.3. 消费者配置文件

<?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="ORDER-USER-MENU-QUEUE" auto-declare="true" durable="true"/><rabbit:queue name="ORDER-CATEGORY-GBLFY-QUEUE" auto-declare="true" durable="true"/><!-- 声明多个消费者对象 --><bean id="mQSimpleMsgHandler" class="com.gblfy.order.mqhandler.MQSimpleMsgHandler"/><bean id="orderMQMonitorMsgHandler" class="com.gblfy.order.mqhandler.OrderMQMonitorMsgHandler"/><!-- 监听队列 --><rabbit:listener-container connection-factory="connectionFactory"><rabbit:listener ref="mQSimpleMsgHandler" method="execute" queue-names="ORDER-CATEGORY-GBLFY-QUEUE"/><rabbit:listener ref="orderMQMonitorMsgHandler" method="execute" queue-names="ORDER-USER-MENU-QUEUE"/></rabbit:listener-container>
</beans>

2.4. 连接配置文件

rabbitmq.host=127.0.0.1
rabbitmq.port=5672
rabbitmq.username=admin
rabbitmq.password=admin
rabbitmq.vhost=/admin

2.5. 生产者代码

package com.gblfy.order.controller;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;@Controller
@Slf4j
public class TopicMQMsgSendController {@Autowiredprivate MQSendMsgUtils mqSendMsgUtils;@RequestMapping(value = "/snedUserMQMsg", method = RequestMethod.GET)@ResponseBodypublic String snedUserMQMsg() {/*** 模拟发送数据* 1. serviceName 接口名称* 2. type        路由routingKey*/String serviceName = "my name serviceName";String type = "user";//发送消息到MQ的交换机,通知其他系统mqSendMsgUtils.sendMsg(serviceName, type);return "snedUserMQMsg success !!!";}@RequestMapping(value = "/sendMenuMQMsg", method = RequestMethod.GET)@ResponseBodypublic String sendMenuMQMsg() {/*** 模拟发送数据* 1. serviceName 接口名称* 2. type        路由routingKey*/String serviceName = "my name serviceName";String type = "menu";//发送消息到MQ的交换机,通知其他系统mqSendMsgUtils.sendMsg(serviceName, type);return "sendMenuMQMsg success !!!";}@RequestMapping(value = "/snedCategoryMQMsg", method = RequestMethod.GET)@ResponseBodypublic String snedCategoryMQMsg() {/*** 模拟发送数据* 1. serviceName 接口名称* 2. type        路由routingKey*/String serviceName = "my name serviceName2";String type = "category.gblfy";//发送消息到MQ的交换机,通知其他系统mqSendMsgUtils.sendMsg(serviceName, type);return "snedCategoryMQMsg success !!!";}public static void main(String[] args) {DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println(dateFormat.format(new Date()));}
}

2.6 消费者 ①

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();}}
}

2.7 消费者 ②

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 OrderMQMonitorMsgHandler {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();}}
}

2.8 MQ工具类

package com.gblfy.order.utils;import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.gblfy.order.pojo.FisCallingTrace;
import com.gblfy.order.pojo.RequestInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;/*** MQ发送消息公用工具类* <p>* MQ发送消息模式采用 通配符模式* order.* 区配一个词* order.# 区配一个或者多个词* <p>** @author gblfy*/
@Component
@Slf4j
public class MQSendMsgUtils {//格式化时间public static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");// 日期格式//引入json工具类private static final ObjectMapper MAPPER = new ObjectMapper();@Autowired//注入发送消息模板private RabbitTemplate rabbitTemplate;/*** 发送MQ消息公用类** @param mFisCallingTrace 轨迹保存的数据对象* @param type             路由routingKey 字符串拼接* @param reqXml           请求报文* @param resXml           响应报文* @param uuid             随机生成的uuid*/public void sendMsg(FisCallingTrace mFisCallingTrace, String type, String reqXml, String resXml, String uuid) {try {RequestInfo requestInfo = new RequestInfo().builder().fisCallingTrace(mFisCallingTrace).mReqXml(reqXml).mResXml(resXml).mUUID(uuid).serviceName(mFisCallingTrace.getServicename()).type(type).build();//发送消息到MQ的交换机,通知其他系统String jsonStr = JSON.toJSONString(requestInfo);rabbitTemplate.convertAndSend("order." + type, jsonStr);} catch (Exception e) {e.printStackTrace();}}/*** 发送MQ消息公用类** @param serviceName 接口名称* @param type        路由routingKey*/public void sendMsg(String serviceName, String type) {try {//发送消息到MQ的交换机,通知其他系统Map<String, Object> msg = new HashMap<String, Object>();msg.put("serviceName", serviceName);msg.put("routingKey", type);msg.put("currentDate", dateFormat.format(new Date()));rabbitTemplate.convertAndSend("order." + type, MAPPER.writeValueAsString(msg));} catch (Exception e) {e.printStackTrace();}}//    public static void main(String[] args) {//        //使用fastjson 实体类对象转jsonStr
//        User ly = new User().builder()
//                .id(1)
//                .name("ly")
//                .build();
//        String jsonStr = JSON.toJSONString(ly);
//        log.info("转换后jsonStr的用户:" + jsonStr);
//
//        //使用fastjson 进行jsonObject转实体类对象
//        String userString = "{\"id\":1,\"name\":\"ly\"}";
//
//        JSONObject userJson = JSONObject.parseObject(userString);
//        User user = JSON.toJavaObject(userJson, User.class);
//
//        log.info("用户姓名:" + user.getName());
//        log.info("用户ID:" + user.getId());
//    }
}

三、管控台队列绑定交换机

3.1. 复制队列名称

3.2. 队列绑定交换机

点击声明的交换机

配置文件中声明的交换机

在交换机中绑定【ORDER-CATEGORY-GBLFY-QUEUE】队列和区配规则(order.#)


在交换机中绑定【ORDER-CATEGORY-GBLFY-QUEUE】队列和区配规则(order.#)
在交换机中绑定【ORDER-USER-MENU-QUEUE】队列和区配规则(order.*)

在交换机菜单中查看,绑定的队列

在队列菜单中查看,绑定的交换机


四、验证测试

4.1. 启动项目

4.2. 清空控制台


4.4. 生产者①请求

http://localhost:8888/snedUserMQMsg

4.5. 生产者②请求

http://localhost:8888/sendSimpleMQMsg2

http://localhost:8888/sendMenuMQMsg

http://localhost:8888/snedCategoryMQMsg

五、启动RabbitMQ

5.1. 进入sbin目录,双击运行

5.2. 启动图示

(需求实战_进阶_04)SSM集成RabbitMQ 通配符模式 关键代码讲解、开发、测试相关推荐

  1. (需求实战_进阶_05)SSM集成RabbitMQ 通配符模式 关键代码讲解、开发、测试

    接上一篇: 文章目录 一.RabbitMQ 配置文件 1. RabbitMQ 生产者配置文件更新 二.启动项目 2.1. 启动项目 2.2. 清空控制台 三.管控台总览 3.1. 登录管控台 3.2. ...

  2. (需求实战_进阶_07)SSM集成RabbitMQ 订阅模式 关键代码讲解、开发、测试

    接上一篇:(企业内部需求实战_进阶_06)SSM集成RabbitMQ 订阅模式 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/104 ...

  3. (需求实战_进阶_03)SSM集成RabbitMQ 路由模式关键代码讲解、开发、测试

    接上一篇:(企业内部需求实战_进阶_02)SSM集成RabbitMQ 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/10421403 ...

  4. (需求实战_进阶_06)SSM集成RabbitMQ 订阅模式 关键代码讲解、开发、测试

    背景: 为了减轻服务器的压力,现在原有项目的基础上集成消息队列来异步处理消息! 此项目是企业真实需求,项目的代码属于线上生产代码,直接用于生产即可! 此项目采用MQ发送消息模式为:订阅模式,如果对Ra ...

  5. (需求实战_终章_08)SSM集成RabbitMQ 订阅模式 关键代码讲解、开发、测试

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200208221057640.png?x-oss-process=image/watermark,type_Z ...

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

    接上一篇:(企业内部需求实战_进阶_01)SSM集成RabbitMQ 关键代码讲解.开发.测试 https://gblfy.blog.csdn.net/article/details/10419730 ...

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

    背景: 为了减轻服务器的压力,现在原有项目的基础上集成消息队列来异步处理消息! 此项目是企业真实需求,项目的代码属于线上生产代码,直接用于生产即可! 此项目采用MQ发送消息模式为:路由模式,如果对Ra ...

  8. (需求实战_终章) SpringBoot2.x 整合RabbitMQ

    文章目录 1. maven依赖 2. MainConfig 3. application.properties 4. 发送字符串 生产者 5. 发送对象 生产者 6. 接收字符串客户端 7. 接收对象 ...

  9. php 动态彩码辨色 接口的调用_好用的云函数!后端低代码接口开发,零基础编写API接口...

    前言 在开发项目过程中,经常需要用到API接口,实现对数据库的CURD等操作. 不管你是专业的PHP开发工程师,还是客户端开发工程师,或者是不懂编程但懂得数据库SQL查询,又或者是完全不太懂技术的人, ...

最新文章

  1. 使用HTML5监測站点性能
  2. jdk7新特性学习笔记
  3. mysql数据库的增删改查命令_MySQL 初识别语句,数据库、表、行的增删改查
  4. 预训练模型参数重载必备!
  5. python中循环结构分有,python常见循环结构有哪些
  6. 直播预告 | 亚马逊高级应用科学家熊元骏:人类行为理解研究进展
  7. 前端学习(3032):vue+element今日头条管理-反馈
  8. ThinkPHP3.2 下载、导入、导出功能的设计与实现
  9. 数据挖掘:概念与技术(第三版)之第八章的学习记录
  10. H3CSE园区-SSH
  11. Linux系统分区访问windows分区提示挂载失败
  12. python登陆126邮箱记录
  13. 【矩阵论笔记】相似对角化、特征子空间(几何重数和代数重数)
  14. 单片机问题,24V NPN接近开关信号,怎么接入到单片机
  15. docker学习(十二)docker secret 的使用
  16. suse linux启用80端口,SuSE Linux防火墙配置
  17. WCE 电源管理器(开胃菜)
  18. 基于FPGA的数字电子琴——数电小系统设计【数字电子技术】(使用Vivado中的verilog语言)含piano代码文件(全)
  19. Linux权限详解(chmod、600、644、700、711、755、777、4755、6755、7755)
  20. 验证运放输入端之间电容作用

热门文章

  1. pytorch单机多卡的正确打开方式 以及可能会遇到的问题和相应的解决方法
  2. pytorch-LSTM的输入和输出尺寸
  3. (pytorch-深度学习)使用pytorch框架nn.RNN实现循环神经网络
  4. Arrays.sort()用来自定义排序的使用
  5. Android中给按钮同时设置背景和圆角示例代码
  6. Win10下VS2015(WDK10)驱动开发环境配置
  7. Hbase 二级索引 Solr int字段排序问题 can not sort on multivalued field
  8. 谈身份管理之基础篇 - 保障云上安全,从[规范账号使用]开始
  9. 云原生应用 Kubernetes 监控与弹性实践
  10. 玩转短视频?守护视频安全?AI智能提速?一分钱体验? 阿里云视频点播大招盘点...