添加確認監聽需要開啟確認監聽模式 實現 addConfirmListener方法confirm模式最大的好處在於他是異步的,一旦發布一條消息,生產者應用程序就可以在等信道返回確認的同時繼續發送
下一條消息,當消息最終得到確認之后,生產者應用便可以通過回調方法來處理該確認消息,如果RabbitMQ因為自身內部錯誤導致消息丟失,就會發送一條nack消息,生產者應用程序同樣可以
在回調方法中處理該nack消息;
消費者:
package com.flying.rabbitmq.api.confirm; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.QueueingConsumer; import com.rabbitmq.client.QueueingConsumer.Delivery; public class Consumer { public static void main(String[] args) throws Exception { //1 創建ConnectionFactory ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost("127.0.0.1"); connectionFactory.setPort(5672); connectionFactory.setVirtualHost("/"); //2 獲取Connection Connection connection = connectionFactory.newConnection(); //3 通過Connection創建一個新的Channel Channel channel = connection.createChannel(); String exchangeName = "test_confirm_exchange"; String routingKey = "confirm.#"; String queueName = "test_confirm_queue"; //4 聲明交換機和隊列 然后進行綁定設置, 最后制定路由Key channel.exchangeDeclare(exchangeName, "topic", true); channel.queueDeclare(queueName, true, false, false, null); channel.queueBind(queueName, exchangeName, routingKey); //5 創建消費者 QueueingConsumer queueingConsumer = new QueueingConsumer(channel); channel.basicConsume(queueName, true, queueingConsumer); while(true){ Delivery delivery = queueingConsumer.nextDelivery(); String msg = new String(delivery.getBody()); System.err.println("消費端: " + msg); } } }
生產者:
package com.flying.rabbitmq.api.confirm; import com.rabbitmq.client.Channel; import com.rabbitmq.client.ConfirmListener; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import java.io.IOException; /** * 添加確認監聽需要開啟確認監聽模式 實現 addConfirmListener方法 * confirm模式最大的好處在於他是異步的,一旦發布一條消息, * 生產者應用程序就可以在等信道返回確認的同時繼續發送下一條消息, * 當消息最終得到確認之后,生產者應用便可以通過回調方法來處理該確認消息, * 如果RabbitMQ因為自身內部錯誤導致消息丟失,就會發送一條nack消息,生產者應用程序同樣可以在回調方法中處理該nack消息; */ public class Producer { public static void main(String[] args) throws Exception { //1 創建ConnectionFactory ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost("127.0.0.1"); connectionFactory.setPort(5672); connectionFactory.setVirtualHost("/"); //2 獲取Connection Connection connection = connectionFactory.newConnection(); //3 通過Connection創建一個新的Channel Channel channel = connection.createChannel(); //4 指定我們的消息投遞模式: 消息的確認模式 channel.confirmSelect(); String exchangeName = "test_confirm_exchange"; String routingKey = "confirm.save"; //5 發送一條消息 String msg = "Hello RabbitMQ Send confirm message!"; channel.basicPublish(exchangeName, routingKey, null, msg.getBytes()); // 添加一個確認監聽 channel.addConfirmListener(new ConfirmListener() { @Override public void handleAck(long deliveryTag, boolean multiple) throws IOException { System.err.println(deliveryTag); System.err.println("-------no ack!-----------"); } @Override public void handleNack(long deliveryTag, boolean multiple) throws IOException { System.err.println("-------ack!-----------"); } }); } }