当前位置: 首页 > news >正文

RabbitMQ的基础使用

/*** 使用rabbitMQ* 1.引用amqp场景 RabbitAutoConfiguration就会自动生效* 2.给容器中自动配置了各种api RabbitTemplate AmqpAdmin CachingConnectionFactory RabbitMessagingTemplate* 所有属性都是 spring.rabbitmq开头* 3.通过注解@EnableRabbit使用* 4.监听消息 使用@RabbitListener 注解 必须有@EnableRabbit才能生效 如果是创建交换机,创建队列 不需要有@EnableRabbit注解* @RabbitListener 可以标在类和方法上* @RabbitHandler 可以标在方法上 场景 一个队列返回的类型不同 使用这个注解来重载*/

1.引入依赖

<!--        mq依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

2.配置文件

spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
#虚拟主机
spring.rabbitmq.virtual-host=/#开启消息生产者发送消息确认
# NONE:禁用发布确认模式,是默认值
#CORRELATED:发布消息成功到交换器后会触发回调方法
#SIMPLEspring.rabbitmq.publisher-confirm-type=correlated
# 开启发送端消息抵达队列的确认
spring.rabbitmq.publisher-returns=true
# 只要抵达队列,以异步发送优先回调这个
spring.rabbitmq.template.mandatory=true#手动ack消息
spring.rabbitmq.listener.simple.acknowledge-mode=manual

3.注入

 @AutowiredAmqpAdmin amqpAdmin;

操作创建交换机,创建队列,创建绑定关系

 /*** 1.如何创建Exchange    Queue Binding?  使用AmqpAdmin进行创建* 2.如何接收消息*/@Testpublic void createExchange(){//创建一个交换机//String name  交换机名称, boolean durable 是否持久化, boolean autoDelete  是否自动删除DirectExchange directExchange = new DirectExchange("hallo-java-exchange", true, false);amqpAdmin.declareExchange(directExchange);System.out.println("单点交换机创建成功"+directExchange);}@Testpublic void createQueue(){//String name 队列名称, boolean durable 是否持久化, boolean exclusive 是否排他,// boolean autoDelete 是否自动删除, @Nullable Map<String, Object> argumentsQueue queue = new Queue("hello-java-queue",true,false,false);amqpAdmin.declareQueue(queue);}/*** 测试创建绑定关系*/@Testpublic void createBing(){//String destination, 目的地// DestinationType destinationType,目的地类型//String exchange 交换机// String exchange, String routingKey, 路由key// @Nullable Map<String, Object> arguments 自定义参数Binding binding = new Binding("hello-java-queue", Binding.DestinationType.QUEUE,"hallo-java-exchange","hello.java",null);amqpAdmin.declareBinding(binding);}
/ 用来发送消息的@AutowiredRabbitTemplate rabbitTemplate;
/*** 测试发送消息功能*/@Testpublic void sendMessageTest(){for(int i=0;i<10;i++){if(i%2 == 0){OrderReturnReasonEntity reasonEntity = new OrderReturnReasonEntity();reasonEntity.setId(1L);reasonEntity.setCreateTime(new Date());reasonEntity.setName("哈哈");//发送消息 如果发送的消息是个对象,我们会使用序列化机制,将对象写出去 对象必须实现 Serializable//也可以用config的方法 将对象类型的消息转为json//String exchange 发送的交换机, String routingKey 路由key, Object object 发送的内容,// correlationData 指定uuid,生产者发送消息给服务时候,获得这个参数,从而确定是哪条消息rabbitTemplate.convertAndSend("hallo-java-exchange","hello.java",reasonEntity,new CorrelationData(UUID.randomUUID().toString()));}else{OrderEntity orderEntity = new OrderEntity();orderEntity.setOrderSn(UUID.randomUUID().toString());rabbitTemplate.convertAndSend("hallo-java-exchange","hello.java",orderEntity,new CorrelationData(UUID.randomUUID().toString()));}}}

接收消息在业务层操作 相关的注解有

@RabbitListener 可以标在类和方法上

@RabbitHandler 可以标在方法上 场景 一个队列返回的类型不同 使用这个注解来重载

@Service("orderItemService")
@RabbitListener(queues = {"hello-java-queue"})
public class OrderItemServiceImpl extends ServiceImpl<OrderItemDao, OrderItemEntity> implements OrderItemService {/*** 测试接收消息* 注解中的queues 声明需要监听的队列,可以是多个* org.springframework.amqp.core.Message 第一个参数是原生的详细信息* OrderReturnApplyEntity 第二个参数 消息的返回类型* Channel 第三个参数 服务获取消息的通道** 场景* 多个客户端启动时,一个消息只能被一个客户端接收 轮询制度* 多个消息等待服务处理时,处理完一个后,才会接收下一个** 设置ack配置 确认前是unack状态 若宕机或其他原因失败,系统再次重启状态为ready 手动签收后消息才被处理掉**/@RabbitHandlerpublic void recieveMessage(Message message, OrderReturnApplyEntity returnApplyEntity,Channel channel) throws IOException {//获取消息体byte[] body = message.getBody();//获取消息头MessageProperties messageProperties = message.getMessageProperties();System.out.println(returnApplyEntity);long deliveryTag = message.getMessageProperties().getDeliveryTag();//channel内按照顺自增的if(deliveryTag%2 == 0){//当业务流程执行完后 手动签收消息 deliveryTag 签收的消息序号, b 是否批量签收channel.basicAck(deliveryTag,false);}else{//拒签 拒签的序号,是否批量操作,是否归队 若false则丢弃 若ture则归队channel.basicNack(deliveryTag,false,false);// 和上面作用一样 只是不能设置批量操作这个参数// channel.basicReject(deliveryTag,false);}}@RabbitHandlerpublic void recieveMessage2(Message message, OrderEntity order,Channel channel){//获取消息体byte[] body = message.getBody();//获取消息头MessageProperties messageProperties = message.getMessageProperties();System.out.println(order);}

4.config文件

@Configuration
public class MyRabbitConfig {@AutowiredRabbitTemplate rabbitTemplate;@Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}/*** 定制RabbitTemplate*/@PostConstruct //MyRabbitConfig对象创建完成后,执行这个方法public void initRabbitTemplate(){//设置确认回调//1.生产者发送消息到服务这一步的确认rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {//CorrelationData correlationData, 当前消息的唯一关联数据(可以理解为id)// boolean b, 判断消息是否成功收到// String s 如果失败,显示失败原因@Overridepublic void confirm(CorrelationData correlationData, boolean b, String s) {System.out.println("correlationData==="+correlationData+"b==="+b+"s==="+s);}});//2.设置消息没有投递给指定的队列,就触发这个失败的回调rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback() {@Overridepublic void returnedMessage(ReturnedMessage returnedMessage) {//获得投递失败的消息的详细信息Message message = returnedMessage.getMessage();//获得投递消息失败的交换机String exchange = returnedMessage.getExchange();//获得投递消息失败的状态码int replyCode = returnedMessage.getReplyCode();//获得投递消息失败的文本String replyText = returnedMessage.getReplyText();//获得投递消息失败的路由keyString routingKey = returnedMessage.getRoutingKey();}});//3.消费端确认(保证每个消息 被正确消费,此时才可以删除这个消息)}

保证消息可靠投递

生产者到交换机 使用confirmCallback; 得到消息投递的结果

交换机到队列 使用 returnCallback; 如果消息接收失败,将会触发,得到失败消息的信息

队列到消费者 使用ack机制;进行手动确认

常见的模式

1.点对点模式,如果路由key和绑定关系完全匹配,交换机才能收到;

2.主题订阅模式,路由key和绑定关系以单词维度匹配,路由key中可以用  “#”代表匹配多个或0个

“*” 代表匹配一个

3.广播模式,不受路由key局限,只要交换机和队列有绑定关系,就可以收到消息;

4.helder性能比较低,一般不适用,私信队列不太熟悉

rabbitmq的基本原理

相关文章:

RabbitMQ的基础使用

/*** 使用rabbitMQ* 1.引用amqp场景 RabbitAutoConfiguration就会自动生效* 2.给容器中自动配置了各种api RabbitTemplate AmqpAdmin CachingConnectionFactory RabbitMessagingTemplate* 所有属性都是 spring.rabbitmq开头* 3.通过注解EnableRabbit使用* 4.监听消息 使用Rabbi…...

使用Uniapp随手记录知识点

使用uniapp随手记录知识点 1 组件内置组件扩展组件 2 vuex状态管理使用流程mapState 辅助函数gettersMutation 1 组件 内置组件 内置组件内主要包含一些基础的view button video scroll-view等内置基础组件&#xff0c;满足基础场景 扩展组件 扩展组件是uniapp封装了一些成…...

Fiber Node的数据结构,以及如何在Reconciliation阶段被使用。

首先&#xff0c;Fiber Node是React用来描述组件树的数据结构&#xff0c;每一个React组件都对应一个Fiber Node。下面是一个Fiber Node的基本结构&#xff1a; const fiber {// 标识这个Fiber Node的类型&#xff08;函数组件&#xff0c;类组件&#xff0c;DOM节点类型等&a…...

Spring Cloud Alibaba 之 Sentinel

大家好&#xff0c;我是升仔 引言 在微服务架构中&#xff0c;服务之间的依赖错综复杂。一旦某个服务出现问题&#xff0c;很容易引发连锁反应&#xff0c;导致整个系统瘫痪。Sentinel 就是为了解决这类问题而生的。它通过流量控制、熔断降级等机制&#xff0c;保护服务不被过多…...

Jenkins Tutorial

什么是Jenkins Jenkins是一个自动化平台&#xff0c;它允许你使用pipelines去部署应用。它也可以自动化其他任务。 BUILDTESTDEPLOYMENT Jenkins 架构 首先&#xff0c;你拥有一个Master Server&#xff0c;它控制pipelines和安排Build到你的Agent上&#xff1b; 其次&…...

css mask 案例

文章目录 一、基本用法二、图案遮罩二、文字阴影效果三、日历探照灯效果 CSS的mask属性用于定义一个可重复使用的遮罩&#xff0c;可以将其应用到任何可视元素上。这个功能类似于Photoshop中的图层蒙版。通过mask属性&#xff0c;可以创建独特的效果&#xff0c;比如圆形、渐变…...

案例系列:Movielens_预测用户对电影的评分_基于行为序列Transformer的推荐系统

文章目录 简介数据集设置准备数据下载并准备数据框将电影评分数据转换为序列 定义元数据为训练和评估创建 tf.data.Dataset创建模型输入编码输入特征创建一个二叉搜索树模型运行训练和评估实验结论 描述&#xff1a; 使用行为序列Transformer&#xff08;BST&#xff09;模型在…...

单词接龙[中等]

一、题目 字典wordList中从单词beginWord和endWord的 转换序列 是一个按下述规格形成的序列beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 1、每一对相邻的单词只差一个字母。 2、对于1 < i < k时&#xff0c;每个si都在wordList中。注意&#xff0c;beg…...

机器人制作开源方案 | 森林管理员

​作者&#xff1a;李佳骏、常睿康、张智斌、李世斌、高华耸 单位&#xff1a;山西能源学院 指导老师&#xff1a;赵浩成、郜敏 1. 研究背景 森林作为地球上可再生自然资源及陆地生态的主体&#xff0c;在人类生存和发展的历史中起着不可代替的作用&#xff0c;它不仅能提供…...

Laravel框架使用phpstudy本地安装的composer用Laravel 安装器进行安装搭建

一、首先需要安装Laravel 安装器 composer global require laravel/installer 二、安装器安装好后&#xff0c;可以使用如下命令创建项目 laravel new sys 三、本地运行 php artisan serve 四、 使用Composer快速安装Laravel5.8框架 安装指定版本的最新版本&#xff08;推荐&a…...

炫酷登录注册界面【超级简单 jQuery+JS+HTML+CSS实现】

一&#xff1a;源码获取 这两天根据需求写了一个比较好看的有动态效果的登录注册切换页面&#xff0c;这里我将源码资源分享给大家&#xff0c;大家可以直接免费下载使用哦&#xff0c;没有 vip 的小伙伴找我私聊发送"登录注册"即可我给你发文件&#xff0c;此登录注…...

2023年国赛高教杯数学建模E题黄河水沙监测数据分析解题全过程文档及程序

2023年国赛高教杯数学建模 E题 黄河水沙监测数据分析 原题再现 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变化和人民生活的影响&#xff0c;以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾等方面都具有重要的理论指导…...

跨国企业传输大文件注意事项和解决方案

随着全球化的推进&#xff0c;越来越多的企业需要在跨国业务合作、项目交付、数据分析等方面展开合作&#xff0c;这就带来了大量大文件的传输需求。大文件传输是指文件大小超过1GB的传输&#xff0c;通常涉及视频、音频、图片、文档、压缩包等多种格式。跨国传输大文件不仅需要…...

【Redis】Redis 的数据类型

有五种常用数据类型&#xff1a;String、Hash、Set、List、SortedSet。以及三种特殊的数据类型&#xff1a;Bitmap、HyperLogLog、Geospatial &#xff0c;其中HyperLogLog、Bitmap的底层都是 String 数据类型&#xff0c;Geospatial 的底层是 Sorted Set 数据类型。 五种常用…...

QT小技巧 - 使用QMovie进行gif切帧

简介 使用QMovie 将 gif 进行切帧&#xff0c; magick 进行合并代码 QString gifPath "E:\\workspace\\qt\\gif2imgs\\203526qre64haq3ccoobqi.gif"; // 你的图片QMovie movie(gifPath); movie.setCacheMode(QMovie::CacheNone);qDebug() << movie.frameCou…...

ES-搜索

聚合分析 聚合分析&#xff0c;英文为Aggregation&#xff0c;是es 除搜索功能外提供的针对es 数据做统计分析的功能 - 功能丰富&#xff0c;提供Bucket、Metric、Pipeline等多种分析方式&#xff0c;可以满足大部分的分析需求 实时性高&#xff0c;所有的计算结果都是即时返回…...

微信小程序面试题

微信小程序面试题 请解释微信小程序的生命周期及其对应的钩子函数。 微信小程序的生命周期包括 onLaunch、onShow、onHide、onError、onPageNotFound 等阶段。对应的钩子函数分别是&#xff1a; onLaunch&#xff1a;小程序初始化时触发。onShow&#xff1a;小程序启动或从后台…...

OpenCV之图像匹配与定位

利用图像特征的keypoints和descriptor来实现图像的匹配与定位。图像匹配算法主要有暴力匹配和FLANN匹配&#xff0c;而图像定位是通过图像匹配结果来反向查询它们在目标图片中的具体坐标位置。 以QQ登录界面为例&#xff0c;将整个QQ登录界面保存为QQ.png文件&#xff0c;QQ登…...

掌握JWT:解密身份验证和授权的关键技术

JSON Web Token 1、什么是JWT2、JWT解决了什么问题3、早期的SSO认证4、JWT认证5、JWT优势6、JWT结构Header 标头Payload 负载 Signature 签名 7、代码实现添加依赖生成Token认证token 8、工具类9、JWT整合Web10、拦截器校验11、网关路由校验12、解决多用户登录的问题13、客户端…...

git命令和docker命令

1、git git是分布式的版本控制工具 git可以通过本地仓库管理文件的历史版本记录 # 本地仓库操作的命令 # 初始化本地库 git init # 添加文件到暂存区 git add . git checkout 暂存区要撤销的文件名称 # 提交暂存区文件 git commit -m 注释# 版本穿梭 # 查看提交记录 git log…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...