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

RabbitMQ 如何保证消息不丢失

  1. 开启消息确认机制:

    在发布消息时,可以设置deliveryMode为2(持久化),以确保消息不会因为RabbitMQ的崩溃而丢失。

  2. 使队列持久化:

    通过设置durabletrue,可以确保队列在RabbitMQ重启后依然存在。

  3. 使消费者确认机制:

    启用手动确认模式,并在消费完消息后手动确认。

  4. 以下是使用Java和Spring AMQP的示例代码:

@Bean
public Queue myQueue() {return QueueBuilder.durable("myQueue").build();
}@Bean
public DirectExchange myExchange() {return new DirectExchange("myExchange");
}@Bean
public Binding myBinding() {return BindingBuilder.bind(myQueue()).to(myExchange()).with("myRoutingKey");
}@Bean
public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();container.setConnectionFactory(connectionFactory);container.setQueueNames("myQueue");container.setMessageListener(listenerAdapter);container.setAcknowledgeMode(AcknowledgeMode.MANUAL); // 手动确认模式return container;
}@Bean
public MessageListenerAdapter listenerAdapter(MyConsumer myConsumer) {return new MessageListenerAdapter(myConsumer, "handleMessage");
}public class MyConsumer {public void handleMessage(Message message) {// 处理消息// ...// 确认消息channel.basicAck(envelope.getDeliveryTag(), false);}
}

在发送消息时:

rabbitTemplate.convertAndSend("myExchange", "myRoutingKey", message, message -> {message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); // 设置消息持久化return message;
});

确保你的消费者在处理完消息后调用basicAck来确认消息,这样即使消费者崩溃,未确认的消息也会被重新传递给另一个消费者。如果你希望在消费者异常时自动重新将消息放回队列,可以在handleMessage方法中捕获异常,并在异常处理逻辑中调用basicNackbasicReject方法,并设置重回队列的参数。

相关文章:

  • Niantic利用Meta Llama让数字生物栩栩如生
  • 使用`War`包部署`Jenkins`(超级详细)
  • Ubuntu20.04 Mysql基本操作知识
  • Windows11 wsl2编译Android14 使用ASfP Debug windows上启动的模拟器
  • 初始C++
  • HTTP的系统登录页面,如何避免明文传输用户密码?
  • 【算法】贪心算法——柠檬水找零
  • 个人关于ChatGPT的用法及建议
  • 颠覆传统:探索Web3对传统计算机模式的冲击
  • Linux-struct list_head的快速使用
  • TPL0401B使用教程
  • springboot+vue的养老院管理系统
  • 【机器学习】让大模型变得更聪明
  • C#根据数据量自动排版标签的样例
  • 【CPP】栈简介及简化模拟实现
  • 【Leetcode】101. 对称二叉树
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 3.7、@ResponseBody 和 @RestController
  • Intervention/image 图片处理扩展包的安装和使用
  • Python进阶细节
  • React+TypeScript入门
  • ReactNativeweexDeviceOne对比
  • Selenium实战教程系列(二)---元素定位
  • Vue.js源码(2):初探List Rendering
  • 阿里云前端周刊 - 第 26 期
  • 对JS继承的一点思考
  • 开源地图数据可视化库——mapnik
  • 前端面试之闭包
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 网页视频流m3u8/ts视频下载
  • 为什么要用IPython/Jupyter?
  • 函数计算新功能-----支持C#函数
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #微信小程序:微信小程序常见的配置传旨
  • (1)(1.9) MSP (version 4.2)
  • (C#)获取字符编码的类
  • (C++17) optional的使用
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (ZT)出版业改革:该死的死,该生的生
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .form文件_SSM框架文件上传篇
  • .gitattributes 文件
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net IE10 _doPostBack 未定义
  • .NET 分布式技术比较
  • .Net6 Api Swagger配置
  • .NET的数据绑定
  • .NET和.COM和.CN域名区别
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)