RabbitMQ三大交換器的使用

交換器聲明

其中 exchange爲交換器名稱
type爲交換器類型,direct還是Fanout還是topic
durable爲交換器持久化參數,爲true標識持久化

     Exchange.DeclareOk exchangeDeclare(String exchange, String type, boolean durable) throws IOException;

隊列聲明

queue 隊列名稱
durable 持久化參數爲true,則隊列會持久化到mq裏面,如果不持久化,那麼一旦mq出故障重啓就會丟失隊列以及隊列裏面的數據
exclusive 是否排他,如果爲false,標識這個隊列可以被多個消費者消費
autoDlete 是否自動刪除 ,如果爲true的話當隊列裏面沒有消費者之後就會自動刪除,不過前提是要被消費過之後纔會去判斷
arguments 這是一個map,可以聲明隊列的過期時間,最大空間,長度,以及超時時間

    Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,
                                 Map<String, Object> arguments) throws IOException;

Direct交換器

direct交換器是最簡單的一個交換器,一版使用隊列名稱作爲路由鍵,全名稱匹配

 public void sendByDirect(){
        Connection connection = Common.getConnection();
        try {
            //創建一個信道,用於消息通信
            Channel channel = connection.createChannel();
            //聲明一個持久化的direct交換器
            channel.exchangeDeclare( DIRECT_EXCHANGE,"direct",true);

            channel.queueDeclare(DIRECT_QUEUE_1,true,false,false,null);
            //綁定隊列和交換器的關係
            //這裏把DIRECT_QUEUE_1隊列綁定到DIRECT_EXCHANGE 交換器上面,並且使用DIRECT_QUEUE_1作爲路由鍵發送消息
            channel.queueBind(DIRECT_QUEUE_1,DIRECT_EXCHANGE,DIRECT_QUEUE_1);
            //使用信道發送消息
            //mandatory 這個標識如果爲true,那麼如果消息無法被路由的時候就會返調用basic.Return 把消息返回給生產者,
            //可以添加一個ReturnListener ,在消息被返回之後會在這裏進行回調
            // 反之直接丟棄
           channel.basicPublish(DIRECT_EXCHANGE,DIRECT_QUEUE_1,false,null,"測試消息".getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Fanout交換器

fanout 交換器不會使用路由鍵,會吧消息發送給交換器上面的所有隊列,類似廣播

 public void sendByFanout(){
        Connection connection = Common.getConnection();
        try {
            //創建一個信道,用於消息通信
            Channel channel = connection.createChannel();
            //聲明一個持久化的fanout交換器
            channel.exchangeDeclare( FANOUT_EXCHANGE,"fanout",true);
 channel.queueDeclare(FANOUT_QUEUE_1,true,false,false,null);
            channel.queueDeclare(FANOUT_QUEUE_2,true,false,false,null);

            //綁定隊列和交換器的關係
            channel.queueBind(FANOUT_QUEUE_1,FANOUT_EXCHANGE,"");
            channel.queueBind(FANOUT_QUEUE_2,FANOUT_EXCHANGE,"");
            channel.basicPublish(FANOUT_EXCHANGE,"",false,null,"測試Fanout消息".getBytes());
            Thread.sleep(60000);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

Topic交換器

tpoic 交換器會使用通配符來匹配路由鍵,*匹配一個,#匹配一個或多個

public void sendByTopic(){
        Connection connection = Common.getConnection();
        try {
            //創建一個信道,用於消息通信
            Channel channel = connection.createChannel();
            //聲明一個持久化的topic交換器
            channel.exchangeDeclare( TOPIC_EXCHANGE,"topic",true);

            channel.queueDeclare(TOPIC_QUEUE_1,true,false,false,null);
            channel.queueDeclare(TOPIC_QUEUE_2,true,false,false,null);
            channel.queueDeclare(TOPIC_QUEUE_3,true,false,false,null);

            //綁定隊列和交換器的關係
           channel.queueBind(TOPIC_QUEUE_1,TOPIC_EXCHANGE,"msg.*.log");
            channel.queueBind(TOPIC_QUEUE_2,TOPIC_EXCHANGE,"msg.#");
            channel.queueBind(TOPIC_QUEUE_3,TOPIC_EXCHANGE,"*.info.*");
            //這裏用5個不同的路由鍵發送消息
            String[] keys = new String[]{"msg.error.log","msg.info.log","msg.info.out","text.info,out","msg.info.out.text"};
            for (String key : keys) {
                channel.basicPublish(TOPIC_EXCHANGE,key,false,null,("測試topic消息,路由鍵爲 "+key).getBytes());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

消費者端

在消費者端並無太大的差別,只需要訂閱好相應的隊列就可以了

 public void consumerDirect(){
        Connection connection = Common.getConnection();
        try {
            Channel channel = connection.createChannel();
            //訂閱相應的隊列
            channel.basicConsume(DIRECT_QUEUE_1,true,new QueueingConsumer(channel){
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    System.out.println("消費者收到消息"+new String(body, StandardCharsets.UTF_8));
                }
            });



        } catch (IOException e) {
            e.printStackTrace();
        }


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