大家好,又见面了,我是你们的朋友全栈君。
RabbitMq-消息持久化
问题:怎样保证消息不因生产者gg而丢失
我们知道了如何在消费者的角度保证消息不丢失,但如果生产者gg了呢,消息同样会丢失,生产者gg后会默认丢弃所有的消息,除非告诉它某些消息是不能丢失的。
解决策略:消息持久化
使用消息持久化,将消息保存到磁盘上,而不是内存中,即使生产者gg了,后面还可以通过读取磁盘来进行恢复。
要实现消息持久化,我们需要做两件事:从queue与message分别来标记持久化。
①首先:从queue角度标记为持久化
注意已经申明的队列不可以再次设置
1 /** 2 * @param queue the name of the queue 3 * @param durable true if we are declaring a durable queue (the queue will survive a server restart) 如果我们声明一个持久队列,则为true(队列将在服务器重启后继续存在) 4 * @param exclusive true if we are declaring an exclusive queue (restricted to this connection) 如果我们声明一个独占队列(仅限于此连接),则为true 5 * @param autoDelete true if we are declaring an autodelete queue (server will delete it when no longer in use) 如果我们声明一个自动删除队列,则为true(服务器将在不再使用时将其删除) 6 * @param arguments other properties (construction arguments) for the queue 队列的其他属性(构造参数) 7 */ 8 boolean durable = true; 9 channel.queueDeclare("hello", durable, false, false, null);
声明队列时的第二个参数,设置为true。当然以上代码是有问题的,因为我们已经声明一个hello了,而且那个hello的持久化是false的,这里我们需要声明一个新的队列:queue_task
1 boolean durable = true; 2 channel.queueDeclare("task_queue", durable, false, false, null);
②从message的角度标记持久化
我们已经标记了queue为持久化,重启后会读取磁盘保存的消息,那么还需要将消息标记为持久化:通过设置MessageProperties的值为:PERSISTENT_TEXT_PLAIN
1 channel.basicPublish(“”, “task_queue“,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());
好了现在我们已经实现消息持久化了。
注意:消息持久化并不能完全保证消息不丢失,级生产者需要将多个message保存到磁盘上,就在保存这个时间窗口上发生了意外,消息同样会丢失,尽管这个时间很短,但还是存在。不过话说回来,尽管这个持久化机制不能百分百地保证消息不丢失,但是做一些简单的任务还是够用的。
转载于:https://www.cnblogs.com/Mao-admin/p/10033678.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107180.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...