(需求实战_进阶_06)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. 启动tomcat7插件
    • 3.2. 清空控制台
  • 四、管控台队列绑定交换机
    • 4.1. 复制队列名称
    • 4.2. 队列绑定交换机
  • 五、请求验证测试
    • 5.1. 生产者①请求
    • 4.5. 生产者②请求
  • 五、启动RabbitMQ
    • 5.1. 进入sbin目录,双击运行
    • 5.2. 启动图示

一、RabbitMQ 订阅模式快速入门

1. RabbitMQ 订阅模式简述

什么是发布/订阅模式(Publish/Subscribe)
  简单解释就是,可以将消息发送给不同类型的消费者。做到发布一次,消费多个。
  
重要知识点:订阅模式不走路由routingKey,消息队列只绑定交换机。

2. RabbitMQ 订阅模式图示

在这里插入图片描述
在这里插入图片描述
解读:
1、1个生产者,多个消费者
2、每一个消费者都有自己的一个队列
3、生产者没有将消息直接发送到队列,而是发送到了交换机
4、每个队列都要绑定到交换机
5、生产者发送的消息,经过交换机,到达队列,实现,一个消息被多个消费者获取的目的

3. MQ角色组成

序号说明角色
生产者PRODUCER
消费者CONSUMER
消息队列QUEUE
交换机EXCHANGE
交换机和队列绑定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"/><!--此处为配置文件方式 管控台配置模式需要注释  默认模式管控台 Start--><!-- 定义一个队列或者多个队列  自动声明--><!-- <rabbit:queue name="ORDER-CATEGORY-GBLFY-QUEUE" auto-declare="true" durable="true"/><rabbit:queue name="ORDER-USER-MENU-QUEUE" auto-declare="true" durable="true"/><rabbit:fanout-exchange name="ORDER-TRACE-EXCHANGE"><rabbit:bindings>&lt;!&ndash; 可绑定多个队列,发送的时候指定key进行发送 &ndash;&gt;<rabbit:binding queue="ORDER-CATEGORY-GBLFY-QUEUE"/><rabbit:binding queue="ORDER-USER-MENU-QUEUE"/></rabbit:bindings></rabbit:fanout-exchange>--><!--此处为配置文件方式 管控台配置模式需要注释  默认模式管控台 End--><!-- 定义交换机 自动声明--><rabbit:fanout-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 FanoutMQMsgSendController {@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. 启动tomcat7插件

在这里插入图片描述

3.2. 清空控制台

在这里插入图片描述

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

4.1. 复制队列名称

在这里插入图片描述在这里插入图片描述

4.2. 队列绑定交换机

点击声明的交换机
在这里插入图片描述
配置文件中声明的交换机
在这里插入图片描述
在交换机中绑定【ORDER-CATEGORY-GBLFY-QUEUE】队列
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在交换机中绑定【ORDER-CATEGORY-GBLFY-QUEUE】队列
在交换机中绑定【ORDER-USER-MENU-QUEUE】队列

在交换机菜单中查看,绑定的队列
在这里插入图片描述
在队列菜单中查看,绑定的交换机
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

五、请求验证测试

5.1. 生产者①请求

http://localhost:8888/snedUserMQMsg
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.5. 生产者②请求

http://localhost:8888/sendMenuMQMsg
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、启动RabbitMQ

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

在这里插入图片描述

5.2. 启动图示

在这里插入图片描述

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

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

相关文章

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

戳蓝字“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;操作系统&…

php 模数 指数 公钥生成_php实现JWT认证

什么是JWTJWT(json web token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息&#xff0c;以便于从资源服务器获取资源。比如用在用户登录上。JWT定义了一种用于简洁&#xff0c;自包…

SpringBoot2.x 整合RabbitMQ_消费端

这一篇讲解消费者 文章目录一、依赖配置1. 引入依赖2. 配置文件3. 主配置二、代码Conding2.1. 消费者代码一、依赖配置 1. 引入依赖 <!--springboot整合RabbitMQ依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>sp…

不断迭代,严苛细节,最终性能如何满足? 基于ELK的大数据平台实践分享

摘要&#xff1a; 在2018年Elastic Meetup 南京交流会中&#xff0c;来自云利来科技的涂海波为现场的听众带来了题为《南京云利来基于ELK的大数据平台》的精彩分享。在本次分享中&#xff0c;他首先进行了公司简介&#xff0c;然后介绍了数据分类&#xff0c;包括数据采集及数据…

cmd输入pip报错_pyhon3下pip安装使用教程(win10)

一、前言 pip 是 Python 包管理工具&#xff0c;该工具提供了对Python 包的查找、下载、安装、卸载的功能。官网下载比较慢,只有几k速度&#xff0c;大家如果还没下载python和pip可以到我的网盘下载。目前pip为v20.0.2版&#xff0c;pytho为v3.8.2&#xff0c;有最新版本会随时…

【小白集合】详解服务器内存和显存基础知识

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | Hardy责编 | 阿秃早期内存通过存储器总线和北桥相连&#xff0c;北桥通过前端总线与CPU通信。从Intel Nehalem起&#xff0c;北桥被集成到CPU内部&#xff0c;内存直接通过存储器总线和CPU相连。所以&#xff0c;在AMD采用So…

如何在机器学习项目中使用统计方法的示例

摘要&#xff1a; 在本文中&#xff0c;将通过十个实例介绍在机器学习项目中起关键作用的统计学方法。 统计学和机器学习是两个密切相关的领域。两者的界限有时非常模糊&#xff0c;例如有一些明显属于统计学领域的方法可以很好地处理机器学习项目中的问题。事实上&#xff0c…

云服务器 文件服务,云服务器文件服务

云服务器文件服务 内容精选换一换远程桌面协议(Remote Desktop Protocol&#xff0c;RDP)&#xff0c;是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows云服务器。从管理控制台下载的RDP文件对应唯一的云服务器&#xff0c;当前RDP文件命名规则为…