RabbitMQ系列教程(八)RabbitMQ中ReturnListener的使用

概述

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));
                }
            });

    }

依次運行消費端、生產端,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章