做网站公司郑州汉狮,建网站和做微信哪个好,桂平网站制作,武建安装公司新闻背景#xff1a; 为了减轻服务器的压力#xff0c;现在原有项目的基础上集成消息队列来异步处理消息! 此项目是企业真实需求#xff0c;项目的代码属于线上生产代码#xff0c;直接用于生产即可#xff01; 此项目采用MQ发送消息模式为:路由模式#xff0c;如果对RabbitM… 背景 为了减轻服务器的压力现在原有项目的基础上集成消息队列来异步处理消息! 此项目是企业真实需求项目的代码属于线上生产代码直接用于生产即可 此项目采用MQ发送消息模式为:路由模式如果对RabbitMQ不熟悉请学习RabbitMQ专栏进行相关知识点的学习遇到问题可以给我留言看到后定会回复 文章目录一、RabbitMQ 路由模式快速入门1. RabbitMQ 路由模式简述2. RabbitMQ 路由符模式图示3. MQ角色组成二、SSM集成RabbitMQ2.1. 引依赖2.2. 生产者配置文件2.3. 消费者配置文件2.4. 连接配置文件2.5. 生产者代码2.6 消费者2.7 MQ工具类三、管控台队列绑定交换机3.1. 复制队列名称3.2. 队列绑定交换机四、验证测试4.1. 启动项目4.2. 清空控制台4.4. 生产者①请求4.5. 生产者②请求五、启动RabbitMQ5.1. 进入sbin目录双击运行5.2. 启动图示一、RabbitMQ 路由模式快速入门
1. RabbitMQ 路由模式简述
生产者申明一个direct类型交换机然后发送消息到这个交换机指定路由键。 消费者指定消费这个交换机的这个路由键即可接收到消息其他消费者收不到。
2. RabbitMQ 路由符模式图示 3. MQ角色组成
序号说明角色①生产者PRODUCER②消费者CONSUMER③消息队列QUEUE④交换机EXCHANGE⑤路由routingKeyROUTINGKEY⑥交换机和队列绑定EXCHANGE和ROUTINGKEY绑定⑦消息区配规则区配一个词还是多个词
二、SSM集成RabbitMQ
2.1. 引依赖 !--spring整合rabbitmq--dependencygroupIdorg.springframework.amqp/groupIdartifactIdspring-rabbit/artifactIdversion1.4.0.RELEASE/version/dependency2.2. 生产者配置文件
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:rabbithttp://www.springframework.org/schema/rabbitxsi:schemaLocationhttp://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 idconnectionFactoryhost${rabbitmq.host} port${rabbitmq.port} username${rabbitmq.username}password${rabbitmq.password} virtual-host${rabbitmq.vhost}/!-- 管理消息队列 --rabbit:admin connection-factoryconnectionFactory/!-- 定义交换机 自动声明--rabbit:direct-exchange nameORDER-TRACE-EXCHANGEauto-declaretrue durabletrue/!-- 定义MQ消息模板 --rabbit:template idrabbitTemplateconnection-factoryconnectionFactory exchangeORDER-TRACE-EXCHANGE/
/beans2.3. 消费者配置文件
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:rabbithttp://www.springframework.org/schema/rabbitxsi:schemaLocationhttp://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 idconnectionFactoryhost${rabbitmq.host} port${rabbitmq.port} username${rabbitmq.username}password${rabbitmq.password} virtual-host${rabbitmq.vhost}/!-- 管理消息队列 --rabbit:admin connection-factoryconnectionFactory/!-- 定义一个队列或者多个队列 --rabbit:queue nameORDER-MENU-CATEGORY-QUEUE auto-declaretrue durabletrue/!-- 声明多个消费者对象 --bean idmQSimpleMsgHandler classcom.gblfy.order.mqhandler.MQSimpleMsgHandler/!-- 监听队列 --rabbit:listener-container connection-factoryconnectionFactoryrabbit:listener refmQSimpleMsgHandler methodexecute queue-namesORDER-MENU-CATEGORY-QUEUE//rabbit:listener-container
/beans2.4. 连接配置文件
rabbitmq.host127.0.0.1
rabbitmq.port5672
rabbitmq.usernameadmin
rabbitmq.passwordadmin
rabbitmq.vhost/admin2.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 SimpleMQMsgSendController {Autowiredprivate MQSendMsgUtils mqSendMsgUtils;RequestMapping(value /sendSimpleMQMsg, method RequestMethod.GET)ResponseBodypublic String snedSimpleMQMsg() {/*** 模拟发送数据* 1. serviceName 接口名称* 2. type 路由routingKey*/String serviceName my name serviceName;String type menu;//发送消息到MQ的交换机通知其他系统mqSendMsgUtils.sendMsg(serviceName, type);return snedSimpleMQMsg success !!!;}RequestMapping(value /sendSimpleMQMsg2, method RequestMethod.GET)ResponseBodypublic String snedSimpleMQMsg2() {/*** 模拟发送数据* 1. serviceName 接口名称* 2. type 路由routingKey*/String serviceName my name serviceName2;String type category;//发送消息到MQ的交换机通知其他系统mqSendMsgUtils.sendMsg(serviceName, type);return snedSimpleMQMsg 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 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的交换机通知其他系统MapString, Object msg new HashMapString, 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-MENU-CATEGORY-QUEUE】队列和路由key(order.category) 在交换机中绑定【ORDER-MENU-CATEGORY-QUEUE】队列和路由key(order.menu) 在交换机菜单中查看绑定的队列 在队列菜单中查看绑定的交换机
四、验证测试
4.1. 启动项目 4.2. 清空控制台 4.4. 生产者①请求
http://localhost:8888/sendSimpleMQMsg
4.5. 生产者②请求
http://localhost:8888/sendSimpleMQMsg2
五、启动RabbitMQ
5.1. 进入sbin目录双击运行 5.2. 启动图示