如何做与别人的网站一样的,咨询公司需要什么专业,城阳网站改版,营销平台建设默认情况下#xff0c;exchange、queue、message 等数据都是存储在内存中的#xff0c;这意味着如果 RabbitMQ 重启、关闭、宕机时所有的信息都将丢失。
RabbitMQ 提供了持久化来解决这个问题#xff0c;持久化后#xff0c;如果 RabbitMQ 发送 重启、关闭、宕机#xff…默认情况下exchange、queue、message 等数据都是存储在内存中的这意味着如果 RabbitMQ 重启、关闭、宕机时所有的信息都将丢失。
RabbitMQ 提供了持久化来解决这个问题持久化后如果 RabbitMQ 发送 重启、关闭、宕机下次起到时 RabbitMQ 会从硬盘中恢复exchange、queue、message 等数据。
1.队列持久化
队列的持久化是在声明队列时指定的
channel.queueDeclare(TASK_QUEUE_NAME, false, false, false, null);如下图声明队列的方法中如果设置 durable为false 时表示不进行持久化 如下图中存在D标识的表示持久化队列没有D表示的是非持久化队列 注意 如果之前声明的队列不是持久化的需要把原先队列先删除或者重新创建一个持久化的队列。否则会出现如下错误 设置持久化的队列即使RabbitMQ 重启、宕机了也依然存在没有进行持久化的队列当RabbitMQ 重启、宕机后就不存在了
把队列设置持久化具体代码如下
public class Task02 {//队列名称public static final String TASK_QUEUE_NAME ACK_QUEUE1;public static void main(String[] args) throws IOException, TimeoutException {Channel channel RabbitMQUtils.getChannel();//声明队列channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);//在控制台中输入信息Scanner scanner new Scanner(System.in);System.out.println(请输入信息);while (scanner.hasNext()) {String message scanner.next();channel.basicPublish(, TASK_QUEUE_NAME, null, message.getBytes(UTF-8));System.out.println(生产者发出消息: message);}}
}2.消息持久化
和queue一样message也是存储在内存中的这意味着如果 RabbitMQ 重启、关闭、宕机时所有的信息都将丢失因此需要将消息进行持久化
因此需要在消息发布时对消息进行持久化
channel.basicPublish(,TASK_QUEUE_NAME,MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes(UTF-8));消息持久化完整代码如下
public class Task02 {//队列名称public static final String TASK_QUEUE_NAME ACK_QUEUE1;public static void main(String[] args) throws IOException, TimeoutException {Channel channel RabbitMQUtils.getChannel();//声明队列channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);//在控制台中输入信息Scanner scanner new Scanner(System.in);System.out.println(请输入信息);while (scanner.hasNext()) {String message scanner.next();channel.basicPublish(, TASK_QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes(UTF-8));System.out.println(生产者发出消息: message);}}
}注意
将消息标记为持久化并不能完全保证不会丢失消息。当RabbitMQ 将消息保存到磁盘但是还没有存储完出现了故障此时就会出现数据丢失的情况