MQ消息队列(主要介绍RabbitMQ)
消息队列概念:是在消息的传输过程中保存消息的容器。
作用:异步处理、应用解耦、流量控制.....
RabbitMQ:


SpringBoot继承RabbitMQ步骤:
1.加入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
2.配置
spring:rabbitmq:host: 192.168.127.129virtual-host: / # 指定虚拟主机port: 5672
3.开启(如果不需要监听消息也就是不消费就不需要该注解开启)
@EnableRabbit
4.创建队列、交换机、以及绑定它们之间的关系
@Configuration
public class MyMQConfig {/*** 创建队列* @return*/@Beanpublic Queue createQueue(){//String name, boolean durable, boolean exclusive, boolean autoDelete, @Nullable Map<String, Object> argumentsQueue queue = new Queue("order.queue",true,false,false);return queue;}/*** 创建交换机* @return*/@Beanpublic Exchange createExchange(){//因为这个交换机需要根据路由进行发送 所以使用TopicExchange//String name, boolean durable, boolean autoDelete, Map<String, Object> argumentsTopicExchange topicExchange = new TopicExchange("order-event-exchange",true,false);return topicExchange;}/*** 通过路由绑定交换机和队列之间的关系* @return*/@Beanpublic Binding createBinding(){//String destination, Binding.DestinationType destinationType, String exchange, String routingKey, @Nullable Map<String, Object> argumentsBinding binding = new Binding("order.queue",Binding.DestinationType.QUEUE,"order-event-exchange","order.route",null);return binding;}}
4.发送消息
@AutowiredRabbitTemplate rabbitTemplate;@ResponseBody@GetMapping("/sendmq")public String sendmq(){OrderEntity orderEntity = new OrderEntity();orderEntity.setOrderSn(UUID.randomUUID().toString());//发送消息 String exchange, String routingKey, Object message, MessagePostProcessor messagePostProcessor, @Nullable CorrelationData correlationDatarabbitTemplate.convertAndSend("order-event-exchange","order.route",orderEntity);return "ok";}
5.消费消息(监听消息)
@Component
@RabbitListener(queues = "create.queue")
public class OrderCloseListener {@RabbitHandlerpublic void orderClose(OrderEntity orderEntity, Message message, Channel channel) throws IOException {System.out.println("消费消息");}
}
问题1:以上消息发送和消费中,如果传输的数据是java对象,默认使用的jdk序列化机制,我们经常需要使用json传递就需要修改传输格式json
修改方法如下:
@Configuration
public class RabbitConfig {//发送消息为对象的时候 使用json的格式@Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}}
问题2:在消息的发送和消费还有消息储存过程中,我们需要保证消息的可靠性,避免消息的丢失保证业务数据的正确
1.消息储存:使用持久化
1.消息发送:开启消息投靠确认机制
spring:rabbitmq:host: 192.168.127.129virtual-host: / # 指定虚拟主机port: 5672
# publisher-confirms: truepublisher-confirm-type: simple # 开启生产者消息确认模式publisher-returns: true
@Configuration
public class RabbitConfig {@AutowiredRabbitTemplate rabbitTemplate;/*** 定制rabbitTemplate* 消息发送确认*/@PostConstruct //表示RabbitConfig对象创建之后执行该方法public void initRabbitTemplate(){//消息成功发送到服务器之后的成功回调rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {/**** @param correlationData 消息的唯一id* @param b 消息是否成功* @param s 消息失败的原因*/@Overridepublic void confirm(CorrelationData correlationData, boolean b, String s) {System.out.println("confirm===correlationData:"+ correlationData+ "ack:"+ b);}});//消息发送到队列queue失败执行的回调rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {/**** @param message 消息的内容* @param i 回复的状态码* @param s 回复的文本内容* @param s1 那个交换机* @param s2 那个路由key** 最常见的就是路由key不对*/@Overridepublic void returnedMessage(Message message, int i, String s, String s1, String s2) {System.out.println("fail====>message:"+ message+"状态码:"+i + "错误提示:"+ s+ "交换机:"+s1 + "路由:"+ s2);}});}
}
异常操作之后可以达到消息发送端确认机制
3.消息消费端的确认机制
spring:rabbitmq:host: 192.168.127.129virtual-host: / # 指定虚拟主机port: 5672
# publisher-confirms: truepublisher-confirm-type: simple # 开启生产者消息确认模式publisher-returns: truetemplate:mandatory: truelistener:simple:acknowledge-mode: manual # 开启消费者 手动签收消息功能
@Service
@RabbitListener(queues = "create.queue")
public class OrderCloseListener {@RabbitHandlerpublic void orderClose(OrderEntity orderEntity, Message message, Channel channel) throws IOException {System.out.println("消费消息。。。.");try{//业务逻辑//手动确认消息消费成功,消息不在写人队列channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);}catch (Exception e){//消息消费失败(业务失败),将消息在次写到队列避免消息丢失channel.basicReject(message.getMessageProperties().getDeliveryTag(),true);}}
}
通过以上消息的发送和消费端都确认之后我们消息一定的是可靠的。
案例:
在实际的开发中我们经常会有取消订单的功能,就可以使用消息队列延迟消费消息,具体实现通过个死信队列,把消息先放到死信队列,当消息到期之后转到到期队列,监听到期队列然后达到订单取消功能
相关文章:
MQ消息队列(主要介绍RabbitMQ)
消息队列概念:是在消息的传输过程中保存消息的容器。 作用:异步处理、应用解耦、流量控制..... RabbitMQ: SpringBoot继承RabbitMQ步骤: 1.加入依赖 <dependency><groupId>org.springframework.boot</groupId&g…...
2023年7月天猫糕点市场数据分析(天猫数据怎么看)
烘焙食品行业是近几年食品领域比较火热的赛道之一,随着居民饮食结构的变化,人均消费水平的上升,蛋糕、面包等烘焙糕点越发成为消费者饮食的重要组成部分。同时,在烘焙糕点市场中,老品牌不断推新迭变,新品牌…...
开源双语对话语言模型 ChatGLM-6B 本地私有化部署
本文首发于:https://www.licorne.ink/2023/08/llm-chatglm-6b-local-deploy/ ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级…...
Zabbix 5.0 媒体介质 邮箱配置例子
QQ企业邮箱 参考:zabbix 腾讯企业邮箱配置图_harveymomo的博客-CSDN博客...
基于Red Hat Enterprise Linux 7操作系统的PostgresSql15的备份恢复(实践笔记)
零、前言 本文是基于阿里云ECS服务器进行的实践操作,操作系统版本:Red Hat Enterprise Linux 7 PG数据库版本:PostgresSql 15 PG安装方式:yum 由于本人新接触pg数据,本次也是出于好奇,就对pg数据库的pg_du…...
AMEYA360:类比半导体推出小尺寸低功耗仪表放大器INA103和INA104
致力于提供高品质芯片的国内优秀模拟及数模混合芯片设计商上海类比半导体技术有限公司(下称“类比半导体”或“类比”)宣布推出小尺寸、低功耗、高性能、零漂移仪表放大器INA103和INA104。该系列产品仅需要一个外部电阻即可设置1到10000的增益,静态电流仅为1.3mA并具…...
【Ubuntu20.04】安装gcc11 g++11, Ubuntu18.04
#查看当前使用的gcc版本命令: gcc -v #更新软件源指令: sudo apt-get update #更新软件指令: sudo app-get upgrade# 添加相应的源 sudo add-apt-repository ppa:ubuntu-toolchain-r/test #更新软件源指令: sudo apt-get update# 卸载已有gcc…...
vim系列之常用命令
一.欢迎来到我的酒馆 在本章节介绍vim编辑器常用命令。 目录 一.欢迎来到我的酒馆二.vim常用命令 二.vim常用命令 2.1vim编辑器常用命令: i: 在光标位置处插入字符。o: 在下一行开始位置插入一行。yy: 复制光标所在的行p: 在光标位置粘贴剪切板内容。...
Scikit-Learn中的特征选择和特征提取详解
概要 机器学习在现代技术中扮演着越来越重要的角色。不论是在商业界还是科学领域,机器学习都被广泛地应用。在机器学习的过程中,我们需要从原始数据中提取出有用的特征,以便训练出好的模型。但是,如何选择最佳的特征是一个关键问…...
Python之动态规划
序言 最近在学习python语言,语言有通用性,此文记录复习动态规划并练习python语言。 动态规划(Dynamic Programming) 动态规划是运筹学的一个分支,是求解决策过程最优化的过程。20世纪50年代初,美国数学家…...
[ES]二基础 |
一、索引库操作 1、mapping属性 mapping是对索引库中文档的约束,常见的mapping属性包括: 1)type:字段数据类型,常见的简单类型有: ①字符串:text(可分词的文本)、keyword(精确值,…...
vscode vue3自定义自动补全
敲代码多了,发现重发动作很多,于是还是定义自动补全代码吧——懒是第一生产力! 1,Ctrl Shift P打开快捷命令行:找到下面这个 2,然后找到ts: 里面给了demo照着写就行 // "Print to conso…...
Spring Cloud + Spring Boot 项目搭建结构层次示例讲解
Spring Cloud Spring Boot 项目搭建结构层次示例讲解 Spring Cloud 项目搭建结构层次示例Spring Cloud示例: Spring Boot 项目搭建结构层次讲解Spring Boot 项目通常按照一种常见的架构模式组织,可以分为以下几个主要层次:当构建一个 Spring…...
使用cgroup工具对服务器某些/全部用户进行计算资源限制
使用cgroup工具对服务器某些/全部用户进行计算资源限制 主要介绍,如何对指定/所有用户进行资源限定(这里主要介绍cpu和内存占用限制),防止某些用户大量占用服务器计算资源,影响和挤占他人正常使用服务器。 安装cgrou…...
C#获取DataTable的前N行数据然后按指定字段排序
获取DataTable的前N行数据然后按指定字段排序 可以使用以下三种代码: 第一种:使用Linq DataTable dtLast dataTable.AsEnumerable().Take(count).OrderBy(dataRow > Convert.ToInt32(dataRow["Sequence"])).CopyToDataTable(); 第二种…...
Swift 中的动态成员查找
文章目录 前言基础介绍基础示例1. 定义一个动态成员访问类:2. 访问嵌套动态成员: 使用 KeyPath 的编译时安全性KeyPath 用法示例KeyPath 进阶使用示例1. 动态访问属性:2. 结合可选属性和 KeyPath:3. 动态 KeyPath 和字典ÿ…...
leetcode做题笔记102. 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 思路一:递归 int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){int** ans(int**)mal…...
python编写四画面同时播放swap视频
当代技术让我们能够创建各种有趣和实用的应用程序。在本篇博客中,我们将探索一个基于wxPython和OpenCV的四路视频播放器应用程序。这个应用程序可以同时播放四个视频文件,并将它们显示在一个GUI界面中。 C:\pythoncode\new\smetimeplaymp4.py 准备工作…...
用XSIBackup为VMware ESXi打造完美备份方案
文章目录 VMware ESXi 备份方案引言XSIBackup安装步骤1. XSIBackup软件安装2. SSH连接3. 定位到xsibackup目录4. 修改文件权限5. 安装cron查看crontab列表6. 配置备份任务结论VMware ESXi 备份方案 引言 数据就像是我们的生命线,一旦丢失,可能会带来无法挽回的损失。对于那…...
React 项目中引入msal验证以及部分报错处理
功能实现 如何在React 项目中引入msal身份验证, 微软在官网有提供文档支持,文档包含示例和具体使用的教程,地址如下: https://learn.microsoft.com/zh-cn/azure/active-directory/develop/tutorial-v2-nodejs-webapp-msal 照着文…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
