概念
RabbitMQ在新增队列后,MQ在正常运行状态下队列是保持运行的,但是,当RabbitMQ出现某种原因崩溃后出现重启或关闭后,队列及消息就会被清除。为防止队列和消息丢失,因而需要将队列和消息标记为持久化。
实例代码
消息提供者:
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
public class DurableProducer {
public static final String QUEUE_NAME = "DURABLE_QUEUE";
public static void main(String[] args) {
try {
Connection connection = RabbitConnectionUtil.getConnection();
Channel channel = connection.createChannel();
/**
* @param queue Queue队列的名称
* @param durable 持久化,如果我们声明的是持久队列(该队列将在服务器重启后存活)。
* @param exclusive 声明独占队列(仅限于此连接)。
* @param autoDelete 如果我们声明一个自动删除队列,则为True(服务器将在不再使用时将其删除)。
* @param arguments 参数队列的其他属性(构造参数)
*/
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
// 动态发送消息
Scanner scanner = new Scanner(System.in);
String message = "";
while (scanner.hasNext()) {
message = scanner.next();
channel.basicPublish("", QUEUE_NAME, null, message.getBytes(StandardCharsets.UTF_8));
System.out.println("[任务提供者]:" + message);
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (TimeoutException e) {
throw new RuntimeException(e);
}
}
}
运行结果
重启前:
注:重启前把java程序停掉,队列显示结果更明显
重启后:
运行命令重启MQ
- systemctl restart rabbitmq-server