RabbitMQ持久化
如果我们希望即使在RabbitMQ服务重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的(durable),消息持久化后我们的消息会保存到我们的磁盘上,这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。当然还是会有一些小概率事件会导致消息丢失。
1.消息队列Queue的持久化
在我们创建队列时,可进行设置
管理页面上显示这个D标识表示队列持久化
但是这只是对队列进行了持久化,并不能保证消息在RabbitMQ服务器重启后仍然存在,所以其实还需要对消息进行持久化
2.消息Message的持久化
生产者在发布消息时对消息属性设置为MessageProperties.PERSISTENT_TEXT_PLAIN就可以将消息进行持久化
注:红色字段
/** * 生产者 */ public class Send { //设定队列名称(已存在的队列) private static final String QUEUE_NAME="queue1"; public static void main(String[] args) throws IOException, TimeoutException { //从MQ工具类获取连接信息 Connection connection = MqConnectionUtils.getConnection(); //创建一个通道 Channel channel = connection.createChannel(); //准备发送的消息内容 String msg = "world"; //发送消息给队列 /** * 参数1:交换机,不定义也会有默认的,因为我们的消息是通过交换机来进行投递给队列的,所以交换机不可能没有 * 参数2:简单模式:队列名称 * 参数3:消息的状态控制 * 参数4:消息内容 */ channel.basicPublish("",QUEUE_NAME,MessageProperties.PERSISTENT_TEXT_PLAIN,msg.getBytes()); System.out.print("发送成功"); //关闭通道 channel.close(); connection.close(); } }
但是其实将消息标记为持久化也并不能完全保证不会丢失消息。尽管它告诉RabbitMQ将消息保存到磁盘上,但这里依然会存在消息丢失的可能,这里就涉及到了RabbitMQ消息确认机制