如何保障当 RabbitMQ 服务停掉以后消息生产者发送过来的消息不丢失?
默认情况下 RabbitMQ 退出或由于某种原因崩溃时,它忽视队列和消息,除非告知它不要这样做。确保消息不会丢失需要做两件事: 我们需要将队列和消息都标记为持久化。
1.队列持久化
正常队列不持久化
Channel channel = Util.getChannel();
boolean durable = false;//是否持久化
channel.queueDeclare(TASK_QUEUE_NAME,durable,false,false,null);
在mq可是界面上显示如下(D标识该队列开启持久化功能)
设置持久化
Channel channel = Util.getChannel();
boolean durable = true;//是否持久化
channel.queueDeclare(TASK_QUEUE_NAME,durable,false,false,null);
2.消息持久化
//在第三个参数中添加MessageProperties.PERSISTENT_TEXT_PLAIN 开启消息持久化
//保存在磁盘上
channel.basicPublish("",TASK_QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());
将消息标记为持久化并不能完全保证不会丢失消息。尽管它告诉 RabbitMQ 将消息保存到磁盘,但是这里依然存在当消息刚准备存储在磁盘的时候 但是还没有存储完,消息还在缓存的一个间隔点。此时并没有真正写入磁盘。持久性保证并不强,但是对于我们的简单任务队列而言,这已经绰绰有余了。