在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環境下有效地保證消息的可靠性。根據具體的業務需求和場景,可以選擇合適的策略來確保消息不丟失。