一篇文章入门RabbitMQ:基本概念与Java利用

news/2025/10/3 16:20:52/文章来源:https://www.cnblogs.com/wzzkaifa/p/19124705

Java配置RabbitMQ

spring:rabbitmq:host: 192.168.88.130port: 5672virtual-host: /hostusername: rootpassword: 123

发送消息

@SpringBootTest
public class SpringAmqpTest {@Resourceprivate RabbitTemplate rabbitTemplate;@Testpublic void testSendMessage() {String queueName = "simple.queue";String msg = "hello,amqp";rabbitTemplate.convertAndSend(queueName,msg);}
}

接收消息

一个队列绑定多个消费者的情形

轮询

默认情况:会将消息轮询投递给消费者

只是简单的分配消息,没有考虑消息的复杂程度,可能会出现消息堆积

能者多劳

修改application.yml设置preFerch为1,确保同一时刻最多投递消费者1条消息,消费者处理完才能获取下一个消息

    listener:simple:prefetch: 1

交换机

接受publisher发送的消息

Fanout交换机

将消息广播到每一个跟其绑定的queue

Direct交换机

每个queue与exchange都会设置BindingKey

发布者发布消息时指定消息的RoutingKey

exchange将消息路由到BindingKey与RoutingKey一致的队列

Topic交换器

Routing Key可以是多个单词的列表,并且以.分割

通配符: xx.# / #.xx

声明队列与交换机

控制台

SpringAMQP

基于Bean
  • Queue:声明队列,用工厂类QueueBuilder构建
  • Exchange:声明交换机,用工厂类ExchangeBuilder构建
  • Binding:声明队列和交换机的绑定关系,用工厂类BindingBuilder构建
基于注解
@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "hmall.queue1"),exchange = @Exchange(name = "hmall.exchange1", type = "direct"),key = {"red","blue"}//创建两个队列,Key分别为red和blue
))

消息转换器

当发送对象时,spring会把对象转换为字节

JDK序列化

Spring默认MessageConvert处理,实现是SimpleMessageConverter,基于JDK的ObjectOutputStream序列化

  • JDK的序列化有安全风险
  • 消息太大
  • 消息可读性差

JSON序列化

用JSON序列化代替JDK序列化

com.fasterxml.jackson.corejackson-databind

在publisher和consumer启动项/配置类中都要配置MessageConverter

@Beanpublic MessageConverter messageConverter() {return new Jackson2JsonMessageConverter();}

可靠性问题

生产者可靠性

生产者重连
spring:rabbitmq:connection-timeout: 1s #MQ的连接超时时间template:retry:enabled: true #开启超时重试机制initial-interval: 1000ms #失败后的初始等待时间multiplier: 1 #失败后下次的等待时长倍数max-attempts: 3 #最大重试次数

阻塞式的重试,在多次重试的等待过程中,当前线程是被阻塞的,影响业务性能

生产者确认

开启确认机制后,MQ收到消息会将确认消息返回给生产者

spring:rabbitmq:publisher-confirm-type: correlated #开始publisher confirm机制,#none关闭机制,simple同步阻塞等待回执消息,correlated异步返回回执消息publisher-returns: true #开启publisher returns机制,返回失败消息

在publisher项目启动项配置ReturnCallback

@Configuration
@Slf4j
public class MqConfirmConfig implements ApplicationContextAware {@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);// 设置回调rabbitTemplate.setReturnsCallback(new RabbitTemplate.ReturnsCallback(){@Overridepublic void returnedMessage(ReturnedMessage returned) {log.debug("收到消息的return callback,{},{},{},{},{}",returned.getExchange(),returned.getReplyCode(),returned.getReplyText(),returned.getRoutingKey(),returned.getMessage());}});}
}

发送消息,指定消息ID,消息ConfirmCallback

@Testvoid testConfirmCallback(){//创建cdCorrelationData cd = new CorrelationData(UUID.randomUUID().toString());//添加confirmcallbackcd.getFuture().addCallback(new ListenableFutureCallback() {@Overridepublic void onSuccess(CorrelationData.Confirm result) {log.info("消息发送成功");if(result.isAck()){log.info("消息发送成功");//收到ack}else{//收到nacklog.error("消息发送失败");}}@Overridepublic void onFailure(Throwable ex) {log.error("消息发送失败,原因{}",result.getReason);}});rabbitTemplate.convertAndSend("confirm.exchange","1","hello,confirm",cd);}

MQ可靠性

默认情况下,RabbitMQ会将收到的消息保存在内存中以降低收发消息的延迟,会导致两个问题

  • MQ宕机,内存中的消息会消失
  • 内存空间有限,消费者故障或消息处理过慢,会导致消息堆积,引发MQ阻塞
数据持久化
  • 持久化队列(Persistent Queue)
    队列本身的元数据(如名称、配置)和队列中的消息会被持久化存储(通常写入磁盘或数据库)。即使消息队列服务重启、崩溃或服务器断电,队列和消息也不会丢失,恢复服务后可继续处理。
  • 交换机持久化
  • 消息持久化 delivery_mode = 2
Lazy Queue
  • 接收到消息直接存入磁盘而非内存(内存只保留最近的消息,默认2048条)
  • 消费者要消费信息时才会从磁盘中读取到内存
  • 支持数百万条消息存储

消费者可靠性

消费者确认机制

消费者处理消息结束后,应该向RabbitMQ发送回执,说明信息处理状态

  • ack: 成功处理消息,RabbitMQ从队列中删除该消息
  • nack: 失败,需要再次投递消息
  • reject: 失败并拒绝该消息,RabbitMQ从队列中删除该消息
spring:rabbitmq:listener:simple:prefetch: 1acknowledge-mode: auto#none关闭, auto自动, manual手动
none:消息投递到消费者立刻返回ack
消息失败处理

当消费者出现异常时,消息会不断requeue,无限循环,使mq的消息处理飙升

解决方法:使用retry机制

spring:rabbitmq:listener:simple:prefetch: 1retry:enabled: true #开启消费者失败重试max-attempts: 3 #最大重试次数initial-interval: 1000 #第一次重试间隔multiplier: 1 #每次重试间隔倍数stateless: true #无状态;false有状态。默认无状态,如果业务中包含事务改为false

如果重试次数耗尽消息依然失败,则需要有MessageRecoverer接口来处理

  • RejectAndDontRequeueRecoverer:重试耗尽后直接reject,默认
  • ImmediateRequeueMessageRecovere: 返回nack,消息重新入队
  • RepublishMessageRecoverer: 将失败消息投递到指定的交换机,如error.direct,之后由人工处理(由该交换机路由到对应的错误队列(如 error.queue)。)
业务幂等性

幂等 指的是f(x) = f(f(x))。在程序开发中指同一个业务执行一次或多次对业务状态的影响是一致的。

  1. 给每个消息设置唯一的id,业务处理成功后将id放入数据库,下次接受消息在数据库查询id是否存在
@Bean
public MessageConverter jacksonMessageConvertor(){Jackson2JsonMessageConverter jjmc = new Jackson2JasonMessageConverter();jjmc.setCreateMessageIds(true);//发送消息时附带UUIDreturn jjmc;
}
  1. 结合业务本身

延迟消息

生产者发送消息时指定一个时间,消费者不会立刻收到消息,而是在指定时间之后才收到消息

应用:延迟任务

死信交换机

成为死信(dead letter条件:

  • 消费者使用reject,nack声明消费失败,并且requeue为false
  • 消息是一个过期消息,超时无人消费
  • 消息队列堆积满了,最早的消息可能成为死信

如果队列通过dead-letter-exchange属性指定了一个交换机,死信就会投递到这个交换机中,这个交换机为死信交换机(Dead Letter Exchange,DLX)

延迟消息插件

原理是设计了一种支持延迟消息功能的交换机,消息投递到交换机后可以暂存一定时间,到期后再投递到队列

@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "hmall.queue1",durable = "true"),exchange = @Exchange(name = "hmall.exchange1", type = "direct",delayer = "true"),key = {"red","blue"}//创建两个队列,Key分别为red和blue,延迟消息设为true,持久化队列
))

延迟订单支付

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

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

相关文章

软件开发 网页设计网站如何更改网站的关键词

一、xlutils是什么是一个提供了许多操作修改excel文件方法的库;属于python的第三方模块xlrd库用于读取excel文件中的数据,xlwt库用于将数据写入excel文件,修改用xlutils模块;xlutils库也仅仅是通过复制一个副本进行操作后保存一个…

PHP程序员要是基础不扎实,越学越吃力

PHP程序员要是基础不扎实,越学越吃力2025-10-03 16:17 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !i…

wap网站开发兰州百姓网免费发布信息网站

Ubuntu下文件/目录对比的软件Meld可能有很多用户还不是很熟悉,下文就给大家介绍如何安装Meld和移植到Gedit下。具体内容如下所述。 Meld允许用户查看文件、目录间的变化。很容易移植到Gedit下,方便用户使用。 安装Meld Meld默认在Ubuntu官方源中&#…

深入解析:[特殊字符]函数指针:C语言的动态灵魂,嵌入式的超能力(202589)

深入解析:[特殊字符]函数指针:C语言的动态灵魂,嵌入式的超能力(202589)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…

酒类产品网站设计做海外购网站

上博士为了毕业写学术论文头都大了,但更难受的是英语不咋地,投稿后经常会因为语言问题而惨遭拒稿,每每想起就令人心情郁郁,天台可期。有些审稿人也会直接告知需要专业的修改,那咋整呢,让润色呗,…

网站可以做二维码吗哈尔滨最大的互联网公司

相信很多电脑用户都知道,电脑系统在运行的时候会产生系统日志,它可以记录系统中的硬件、软件和系统的各种问题信息,可以通过它检索错误发生的原因,不过时间长了,这类日志文件就会积压,导致系统存储变小&…

lesson70:jQuery Ajax完全指南:从基础到4.0新特性及现代替代优秀的方案引言:jQuery Ajax的时代价值与演进

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《电路基础》第八章学习笔记

《电路基础》第八章学习笔记本章学习二阶电路,典型是RLC电路。电路中包含三种无源元件(两种储能元件)。可以用二阶微分方程表征其特性。初值与终值的确定关键点:分析电路时,必须始终仔细地处理电容器两端电压v(t)…

《电路基础》第七章学习笔记

《电路基础》第七章学习笔记本章主要介绍一阶电路,需要用到一阶微分方程来表征无源RC电路形成: 一个电阻器与一个已充电电容器组成的串联电路,当直流电源突然断开时,就会得到无源RC电路。由这个图,我们对顶点使用…

XGBoost

XGBoostXGBoost的算法原理 ​ 设选择了使用$k$个Tree来拟合数据,XGBoost的原理是使用第一颗树来拟合原始数据,得到$\hat y_1$,然后用$\hat y_1$替换原来的$y$,再用第二颗树来拟合数据。最终的预测结果是每个数的预…

LLM大模型:deepseek sparse attention是个啥?

1、近期,deepseek-3.2-EXP发布,价格大幅下降,如下:价格大幅下降,这是谁给的底气了?必定是成本大幅下降呗,否则不得亏死?那么问题又来了:成本又是怎么大幅下降的了?2、时至今日,尽管被各种吐槽(其中不乏yan…

做公司网站需要制作内容济宁网站开发公司

有时候被ZABBIX监控的主机可能需要关机重启等维护操作,为了在此期间不触发告警,需要创建主机的维护任务,以免出现误告警 ZABBIX本身有这个API可供调用(不同版本细节略有不同,本次用的ZABBIX6.*),实现批量化建立主机的维护任务 无论哪种方式(IP列表,主机描述,或IP子网)创建维护…

如何更换网站图片wordpress 设置图片大小

11.2.0.3数据库环境,使用rman进行归档日志备份,想实现: (1)每天备份归档日志,备份完并不删除归档日志 (2)归档日志备份成功一次之后,下次再备份的时候rman就自动不会再次备份这个归档日志 这个需求可以通过 backup …

北京专业网站翻译影音字幕翻译速记速记快而高效公司网站的seo优化怎么做

2019独角兽企业重金招聘Python工程师标准>>> 快捷菜单 当用户点击界面上某个元素超过2秒后,将启动注册到该界面的快捷菜单。 步骤: 1.代码动态生成菜单 final static int CONTEXT_MENU_1 Menu.FIRST;final static int CONTEXT_MENU_2 Menu…

vs做网站怎样添加图片普通网站报价多少

用过小米miui的用户都知道,miui的“文件管理”里边有一个非常好用的功能-远程管理,如果手机与电脑都在同一个wifi网络下,即同一个局域网内,不用数据线直接就可以连接。打开手机的文件管理—远程管理—启动服务,将生成一…

一个公司可以做两个网站推广吗分类信息网站织梦模板

缩小包围圈游戏其实是一个不可能完成的任务,但是它会给游戏者带来无尽欢笑,使小组充满活力,让队员们能够自然地进行身体接触和配合,消除害羞和忸怩感,创造融洽的气氛,为后续工作的开展奠定良好基础。可以作…

详细介绍:从零到一:Docker Compose 轻松部署微服务实战!

详细介绍:从零到一:Docker Compose 轻松部署微服务实战!2025-10-03 15:59 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importan…

软著申请全流程材料模板,2025年最新模板汇总! - 实践

软著申请全流程材料模板,2025年最新模板汇总! - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

四川话ASR-微调-语音识别-Paraformer-Large - 教程

四川话ASR-微调-语音识别-Paraformer-Large - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

茂名专业网站建设公司亚马逊网站建设分析

推荐阅读 给软件行业带来了春天——揭秘Spring究竟是何方神圣(一) 给软件行业带来了春天——揭秘Spring究竟是何方神圣(二) 文章目录 推荐阅读关联查询子查询 关联查询 关联查询 从多张表中查询对应记录的信息,关联查…