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保存到磁盘上,就在保存这个时间窗口上发生了意外,消息同样会丢失,尽管这个时间很短,但还是存在。不过话说回来,尽管这个持久化机制不能百分百地保证消息不丢失,但是做一些简单的任务还是够用的。

2.RabbitMq-持久化的更多相关文章

  1. 消息中间件-RabbitMQ持久化机制、内存磁盘控制

    RabbitMQ持久化机制 RabbitMQ内存控制 RabbitMQ磁盘控制 RabbitMQ持久化机制 重启之后没有持久化的消息会丢失 package com.study.rabbitmq.a13 ...

  2. RabbitMQ持久化编码注意事项

    以Java语言,MQ客户端为amqp-client作为示例 1.基本原则 direct模式,由生产者声明队列名,消费者也声明队列名 topic模式,由生产者声明交换器名,由消费者声明队列名+交换器名+ ...

  3. RabbitMQ持久化

    我们知道,如果消息接收端挂了,消息会保存在队列里.下次接收端启动就会接收到消息. 如果RabbitMQ挂了怎么办呢?这时候需要将消息持久化到硬盘 消息发送端:producer ........... ...

  4. RabbitMQ学习笔记(6)----RabbitMQ 持久化和非持久化

    持久化:将交换机或队列数据保存到磁盘,服务器宕机或重启之后依然存在. 非持久化:将交换机或队列的数据保存到内存中,服务器宕机或重启之后数据将不存在. 在RabbitMQ中也提供了持久化和非持久化方式. ...

  5. rabbitmq 持久化 事务 发送确认模式

    部分内容来自:http://blog.csdn.net/hzw19920329/article/details/54315940 http://blog.csdn.net/hzw19920329/ar ...

  6. RabbitMQ持久化机制、内存磁盘控制(四)

    一.持久化 如果看到这一篇文章的朋友,都是有经验的开发人员,对持久化的概念就不用再做过多的解析了,经过前面的几篇文章,其实不难发现RabbitMQ 的持久化其实就只分交换器持久化.队列持久化和消息持久 ...

  7. python rabbitMQ持久化队列消息

    import pika connection = pika.BlockingConnection( pika.ConnectionParameters('localhost'))#建立一个最基本的so ...

  8. RabbitMQ持久化和非持久化

    但是,非持久化要比持久化速度更快. 队列是否需要持久化:看需求

  9. 学习在.NET Core中使用RabbitMQ进行消息传递之持久化(二)

    前言 上一节我们简单介绍了RabbitMQ和在安装后启动所出现的问题,本节我们开始正式进入RabbitMQ的学习,对于基本概念请从官网或者其他前辈博客上查阅,我这里不介绍基础性东西,只会简单提一下,请 ...

  10. 【转】RabbitMQ基础——和——持久化机制

    这里原来有一句话,触犯啦天条,被阉割!!!! 首先不去讨论我的日志组件怎么样.因为有些日志需要走网络,有的又不需要走网路,也是有性能与业务场景的多般变化在其中,就把他抛开,我们只谈消息RabbitMQ ...

随机推荐

  1. Ubuntu16.04 + caffe + cuda 环境搭建

    1. sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-de ...

  2. JTree实现QQ好友列表

    最近学习了一下JTree的使用方法: 先来看一下树的实例: 构建一个树, DefaultMutableTreeNode root = new DefaultMutableTreeNode(" ...

  3. Ubuntu Nginx Uwsgi Python布置服务器Django项目

     1 安装python 3.6 ubuntu预装了2.7,不需要卸载预装库,直接安装python3.6(其实现在的阿里云18.04会给你自动装python2.7.15和3.6.8) 你可以分别查看一下 ...

  4. linux 使用 rz 上传和 sz下载 命令

    linux系统 root权限 lrzsz安装包 ①.在线安装-执行命令 yum install lrzsz  离线安装-需要提前准备好安装包 编译安装 root 账号登陆后,依次执行以下命令: tar ...

  5. Django获取用户form表单

    首先创建一个Django 的工程项目 前面我们说过了,那到一个项目首先把模板路径,和静态路径在settings.py设置好以后,在开始写代码,写代码也要按照我们以前说的那个工程目录结构写. 现在我们做 ...

  6. Graphic系统综合练习案例-绘制饼状图

    这里用一个案例来将之前学过的关于绘制相关的东东加强巩固一下,纯绘制,木有加点击效果,先来看下最终效果: github中这种百分比饼图的效果非常非常之多,实际在项目中开发当产品有这样类似的需求时做为开发 ...

  7. IIS配置web.config 将带www域名转为不带www域名

    在configuration节点中添加 <configuration> <system.webServer> <rewrite> <rules> < ...

  8. python_推导式

    列表推导式 目的:方便的生成一个列表 格式: v1 = [i for i in 可迭代对象 ] v2 = [i for i in 可迭代对象 if条件]#条件为True菜进行append v1 = [ ...

  9. 浅析Json底层

    在开始了解Json的原理之前,首先看一段代码,在这里以阿里的FastJson为例. public class JsonRun { public static void main(String[] ar ...

  10. [唐胡璐]Selenium技巧- 抓图并保存到TestNG报告中

    这里不讲解怎么在Eclipse安装配置TestNG,网上一搜一大把,大家自己去实践一下。 在这里主要说一下用Java来实现Selenium Webdriver的截图功能和把截图写到TestNG的报告中 ...