之前我们创建的队列都是非持久化的,rabbitmq如果重启的化,该队列就会被删除掉,如果 要队列实现持久化 需要在声明队列的时候把durable参数设置为持久化
下面修改一下持久化参数为true
不出所料,果真报错,原因是我们之前已经声明了他是一个不持久化的队列,所以我们需要把他删除掉重新进行一次声明
完成操作后进入管理页面看到”D“标识,则证明该队列已经持久化成功,重启后队列依旧存在,
例如下方所示,如果重启mq那么队列将只显示name为seckill-mongo-save.default
的队列
刚才已经介绍了队列持久化,那么一定可以保证消息不丢失吗?结果显然不是,我们还需要对消息进行持久化。再发消息时我们需要通知队列该消息是持久化的。对于简单的队列而言,我们只需要在发布消息时修改一个参数,来告诉RabbitMQ将消息保存到磁盘,但是这里依然存在当消息刚准备存储在磁盘的时候 但是还没有存储完,消息还在缓存的一个间隔点。此时并没有真正写入磁盘。如果需要更强有力的持久化策略,后续会继续更新消息的发布确认。
代码段演示
- while (scanner.hasNext()){
- String message = scanner.next();
- /**
- * 发送一个消息
- * 1.发送到哪个交换机
- * 2.路由的key值是哪一个 本次是队列名称
- * 3.其他参数信息 MessageProperties.PERSISTENT_TEXT_PLAIN 生产者发送的消息持久化到磁盘且优先级为0
- * 4.发送消息的消息体
- * 5.getBytes("UTF-8") 中文汉字进行二进制转换时防止乱码
- */
- channel.basicPublish("",TASK_QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes("UTF-8"));
- System.out.println("生产者发出消息"+message);
-
- }