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

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

在这里插入图片描述
此项目采用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
路由routingKeyROUTINGKEY
交换机和队列绑定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. 启动图示

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

halo多人正在连接服务器,在线人数过低 《光晕2》PC版多人服务器下月关闭

这也许是一个让粉丝略伤感的消息&#xff0c;《光晕2(Halo2)》PC多人游戏服务器将在下个月永久关闭。343 Industries注意到服务器的峰值在线人数一直仅有20人&#xff0c;因此做出了关闭服务器的决定。343 Industries在Halo Waypoint中说道&#xff1a;“我们很遗憾地宣布&…

纯Python实现鸢尾属植物数据集神经网络模型

摘要&#xff1a; 本文以Python代码完成整个鸾尾花图像分类任务&#xff0c;没有调用任何的数据包&#xff0c;适合新手阅读理解&#xff0c;并动手实践体验下机器学习方法的大致流程。 尝试使用过各大公司推出的植物识别APP吗&#xff1f;比如微软识花、花伴侣等这些APP。当你…

【明人不说暗话】我就只讲进程与线程

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 阮一峰责编 | 阿秃进程&#xff08;process&#xff09;和线程&#xff08;thread&#xff09;是操作系统的基本概念&#xff0c;但是它们比较抽象&#xff0c;不容易掌握。最近&#xff0c;我读到一篇材料&#xff0c;发现有…

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

接上一篇&#xff1a; 文章目录一、RabbitMQ 配置文件1. RabbitMQ 生产者配置文件更新二、启动项目2.1. 启动项目2.2. 清空控制台三、管控台总览3.1. 登录管控台3.2. 交换机中查看绑定队列总览四、验证测试4.4. 生产者①请求4.5. 生产者②请求五、启动RabbitMQ5.1. 进入sbin目录…

两台邮件服务器共用一个公网地址,两个不同域邮件服务器的互通

两个不同域的邮件服务的互通如图&#xff0c;有两个不同域的邮件服务器(postfix)通过一个DNS服务器实现互通。首先说明一下IP分配情况服务器1qq.cometh0(VMnet2)&#xff1a; ip:192.168.2.2 netmask:255.255.255.0 gw 192.168.2.1 hostname:mail.qq.com服务器2(qq.neteht0VMne…

希捷银河声音大_【推仔说新闻】那款硬盘它终于来了 希捷推出首款双磁臂硬盘...

经常关注科技新闻的朋友们应该都知道&#xff0c;现在机械硬盘领域可以说是被固态硬盘冲击的不清&#xff0c;而对于我们广大用户们来说&#xff0c;HDD这一个储存介质就被我们更多的用来充当仓库盘使用&#xff0c;毕竟现在的固态已经下探到白菜级别的价格了。但是对于那些HDD…

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

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

【目瞪口呆】通信机房内部长这样

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 小枣君责编 | 刘晶晶大家好&#xff0c;我是小枣君。一直以来&#xff0c;我都在努力给大家做通信知识科普&#xff0c;也写了很多有趣的文章。不过&#xff0c;文章再有趣也只是文字&#xff0c;不是实物。现实生活中&#…

NLP的ImageNet时代已经到来

摘要&#xff1a; NLP领域即将巨变&#xff0c;你准备好了吗&#xff1f; 自然语言处理&#xff08;NLP&#xff09;领域正在发生变化。 作为NLP的核心表现技术——词向量&#xff0c;其统治地位正在被诸多新技术挑战&#xff0c;如&#xff1a;ELMo&#xff0c;ULMFiT及Open…

mysql字段分隔符拆分_面试题Mysql数据库优化之垂直分表

在日常的开发工作中&#xff0c;除了JAVA相关的技术&#xff0c;打交道最多的就是Mysql数据库&#xff0c;当数据积累到一定程度&#xff0c;比如500W时就会难免出现一些慢sql&#xff0c;对数据库的优化方式有很多&#xff0c;比如通过增加合理的索引&#xff0c;今天我们来说…

python print用法不换行_python3让print输出不换行的方法

python 3.x版本print输出不换行的格式如下&#xff1a; print(x, end"") 其中&#xff0c;end"" 可使输出不换行&#xff0c;不能省略。 举例&#xff1a;输出结果&#xff1a;内容扩展&#xff1a; python3.x中如何实现print不换行 大家应该知道python中p…

使用Numpy和Opencv完成图像的基本数据分析(Part II)

摘要&#xff1a; 使用Numpy和Opencv完成图像的基本数据分析后续部分&#xff0c;主要包含逻辑运算符操作、掩膜以及卫星图像数据分析等操作 在上一节中&#xff0c;主要是介绍了图像的基本知识以及OpenCV的基本操作&#xff0c;具体内容参见“使用Numpy和Opencv完成基本图像的…

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

接上一篇&#xff1a;&#xff08;企业内部需求实战_进阶_06&#xff09;SSM集成RabbitMQ 订阅模式 关键代码讲解、开发、测试 https://gblfy.blog.csdn.net/article/details/104219096 此项目采用MQ发送消息模式为:订阅模式&#xff0c;如果对RabbitMQ不熟悉&#xff0c;请学习…

分布式事务方案这么多,到底应该如何选型?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 温卫斌责编 | 刘晶晶源自 | dbaplus社群作者介绍温卫斌&#xff0c;就职于中国民生银行信息科技部&#xff0c;目前负责分布式技术平台设计与研发&#xff0c;主要关注分布式数据相关领域。微服务兴起的这几年涌现出不少分布…

造大专计算机学历,广昌县职业技术学校计算机应用专业助您 掌握一技之长获大专学历...

——专题宣传报道之四&#xff1a;计算机应用专业计算机应用专业一直是广昌县职业技术学校开设的特色专业。该专业由一批经验丰富、专业优秀的教师任教&#xff0c;主要学习计算机操作、组装、网络应用、影视后期制作、平面设计、文档管理等理论知识和实训课程。特色一&#xf…

阿里云正式推出消息队列Kafka:全面融合开源生态

摘要&#xff1a; 在全面兼容Apache Kafka生态的基础上&#xff0c;消息队列Kafka彻底解决Apache Kafka稳定性不足的长期痛点&#xff0c;并且支持消息无缝迁移到云上。 近日&#xff0c;阿里云宣布正式推出消息队列Kafka&#xff0c;全面融合开源生态。在全面兼容Apache Kafk…

异常将上下文初始化事件发送到类的侦听器实例_Spring的Bean实例化原理,这一次彻底搞懂了!...

前言之前分析了Spring XML和注解的解析原理&#xff0c;并将其封装为BeanDefinition对象存放到IOC容器中&#xff0c;而这些只是refresh方法中的其中一个步骤——obtainFreshBeanFactory&#xff0c;接下来就将围绕这这些BeanDefinition对象进行一系列的处理&#xff0c;如Bean…

(需求实战_01) SpringBoot2.x 整合RabbitMQ_生产端

文章目录一、依赖配置引入1. 引入SpringBoot整合RabbitMQ依赖2. 生产者配置文件3. 主配置二、代码Conding2.1. 生产者代码2.2. 实体对象2.3. 测试类一、依赖配置引入 1. 引入SpringBoot整合RabbitMQ依赖 <!--springboot整合RabbitMQ依赖--><dependency><groupI…

全域图像搜索给你更精准的搜索体验

摘要&#xff1a; 2018飞天技术汇&#xff0c;阿里巴巴机器智能技术实验室的刘磊带来题为全域精准图像搜索介绍的演讲&#xff0c;主要从四个方面进行了阐述&#xff0c;第一部分介绍了图像搜索的基本概念&#xff0c;第二部分主要是讲解了图像搜索的技术架构及其优势&#xff…

【这些都不知道你就是个弟弟】Docker常用命令

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 程序员欣宸转自 | 企业博客责编 | 阿秃除了基本的docker pull、docker image、docker ps&#xff0c;还有一些命令及参数也很重要&#xff0c;在此记录下来避免遗忘。环境信息以下是本次操作的环境&#xff1a;操作系统&…