概述
ReturnListener用於處理一些不可路由的消息(比如因失誤把routeKey或交換機名稱寫錯)。
開啓Return消息機制
basicPublish(...)
方法的參數mandatory
設置爲true
,當發送消息不可達時,會執行ReturnListener
,如果爲false
則會刪除該消息- 添加監聽事件
channel.addReturnListener
代碼實現
- 生產者
public static void main(String[] args) throws Exception{
ConnectionFactory connectionFactory=new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//設置虛擬主機
connectionFactory.setVirtualHost("/");
//創建一個鏈接
Connection connection = connectionFactory.newConnection();
//創建channel
Channel channel = connection.createChannel();
String exchangeName="test_return_exchange";
String routeKey="error.test";
String msg="RabbitMQ send message return test!";
//添加Return監聽事件
channel.addReturnListener(new ReturnListener() {
@Override
public void handleReturn(int replyCode, String replyText, String exchange, String routingKey,
AMQP.BasicProperties properties, byte[] body) throws IOException {
System.err.println("---------return msg----------");
System.err.println("replyCode: " + replyCode);
System.err.println("replyText: " + replyText);
System.err.println("exchange: " + exchange);
System.err.println("routingKey: " + routingKey);
System.err.println("properties: " + properties);
System.err.println("body: " + new String(body));
}
});
//參數 mandatory:true,當發送消息不可達時,會執行ReturnListener ,如果爲false則會刪除該消息
channel.basicPublish(exchangeName,routeKey,true,null,msg.getBytes());
}
- 消費者
public static void main(String[] args) throws Exception{
ConnectionFactory connectionFactory=new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
//設置虛擬主機
connectionFactory.setVirtualHost("/");
//創建鏈接
Connection connection = connectionFactory.newConnection();
//創建channel
Channel channel = connection.createChannel();
String exchangeName="test_return_exchange";
String exchangeType="topic";
//聲明Exchange
channel.exchangeDeclare(exchangeName,exchangeType,true,false,false,null);
String queueName="test_return_queue";
//聲明隊列
channel.queueDeclare(queueName,true,false,false,null);
String routeKey="return.#";
//綁定隊列和交換機
channel.queueBind(queueName,exchangeName,routeKey);
channel.basicConsume(queueName, true, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("接收到消息::"+new String(body));
}
});
}
依次運行消費端、生產端,