在Linux环境下,RabbitMQ通过以下几种方式来保证消息的可靠性:
durable=true,这样即使RabbitMQ服务器重启,队列也会保留。deliveryMode=2(持久化模式),这样消息会被写入磁盘,即使RabbitMQ服务器重启,消息也不会丢失。// 声明持久化队列
channel.queueDeclare("durable_queue", true, false, false, null);
// 发送持久化消息
channel.basicPublish("", "durable_queue", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
// 开启Publisher Confirms
channel.confirmSelect();
// 发送消息并等待确认
try {
channel.basicPublish("", "queue_name", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
if (!channel.waitForConfirms()) {
// 处理未确认的消息
}
} catch (IOException e) {
e.printStackTrace();
}
autoAck=false,手动发送确认消息给RabbitMQ,确保消息已经被成功处理。// 设置手动确认
channel.basicConsume("queue_name", false, deliverCallback, consumerTag -> { });
// 处理消息并确认
boolean autoAck = false;
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
try {
// 处理消息
processMessage(delivery.getBody());
// 确认消息
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
} catch (Exception e) {
// 处理失败,拒绝消息并重新入队
channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, true);
}
};
通过以上几种方式,RabbitMQ可以在Linux环境下有效地保证消息的可靠性。根据具体的业务需求和场景,可以选择合适的策略来确保消息不丢失。