RabbitMq-消息持久化

问题:怎样保证消息不因生产者gg而丢失
我们知道了如何在消费者的角度保证消息不丢失,但如果生产者gg了呢,消息同样会丢失,生产者gg后会默认丢弃所有的消息,除非告诉它某些消息是不能丢失的。

解决策略:消息持久化
使用消息持久化,将消息保存到磁盘上,而不是内存中,即使生产者gg了,后面还可以通过读取磁盘来进行恢复。

要实现消息持久化,我们需要做两件事:从queue与message分别来标记持久化。

①首先:从queue角度标记为持久化

注意已经申明的队列不可以再次设置

 /**
* @param queue the name of the queue
* @param durable true if we are declaring a durable queue (the queue will survive a server restart) 如果我们声明一个持久队列,则为true(队列将在服务器重启后继续存在)
* @param exclusive true if we are declaring an exclusive queue (restricted to this connection) 如果我们声明一个独占队列(仅限于此连接),则为true
* @param autoDelete true if we are declaring an autodelete queue (server will delete it when no longer in use) 如果我们声明一个自动删除队列,则为true(服务器将在不再使用时将其删除)
* @param arguments other properties (construction arguments) for the queue 队列的其他属性(构造参数)
*/
boolean durable = true;
channel.queueDeclare("hello", durable, false, false, null);

声明队列时的第二个参数,设置为true。当然以上代码是有问题的,因为我们已经声明一个hello了,而且那个hello的持久化是false的,这里我们需要声明一个新的队列:queue_task

 boolean durable = true;
channel.queueDeclare("task_queue", durable, false, false, null);

②从message的角度标记持久化
我们已经标记了queue为持久化,重启后会读取磁盘保存的消息,那么还需要将消息标记为持久化:通过设置MessageProperties的值为:PERSISTENT_TEXT_PLAIN

channel.basicPublish("", "task_queue",MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());

好了现在我们已经实现消息持久化了。

注意:消息持久化并不能完全保证消息不丢失,级生产者需要将多个message保存到磁盘上,就在保存这个时间窗口上发生了意外,消息同样会丢失,尽管这个时间很短,但还是存在。不过话说回来,尽管这个持久化机制不能百分百地保证消息不丢失,但是做一些简单的任务还是够用的。

最新文章

  1. C++对C的函数拓展
  2. spring事务管理器设计思想(二)
  3. Ajax 应用六个需要注意的事项
  4. 随笔 高质量 C++/C 编程指南
  5. beeline vs hive cli
  6. [cocoapods] 如何卸载工程里的cocoapods
  7. 《C#并行编程高级教程》第6章 PLINQ:声明式数据并行 笔记
  8. 过滤器(filter)实现用户登录拦截
  9. 本地存储-webStorage
  10. socket简单通信
  11. 【转】Plotting texts as graphs with R and igraph
  12. set 利用lower_bound实现key索引
  13. 智能合约语言 Solidity 教程系列1 - 类型介绍
  14. 机器学习web服务化实战:一次吐血的服务化之路
  15. (二)版本控制管理器之CVS(上)
  16. truncate和delete命令的优缺点和原理解析,适用场合
  17. VueJs(1)---快速上手VueJs
  18. 51Nod 1264 线段相交(计算几何)
  19. spark操作kudu之DML操作
  20. [daily][pcaman] pacman滚动升级跳过指定包

热门文章

  1. 用Activator.CreateInstance代替new实现类的实例化
  2. Session Timer机制分析
  3. 编写Dockerfile自定义镜像
  4. h5嵌套iframe实时传参(适用vue)
  5. echo打印换行
  6. 【jekins】安装jdk遇到的坑
  7. 第七章、Ajango自带auth模块
  8. 命令行工具--netstat
  9. Djnago模板与标签
  10. 抽象类能使用 final 修饰吗?(未完成)