RabbitMQ系列 通過Rabbit-client操作mq(exchange,queue,binding)

1,導入依賴包pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.edu.mq</groupId>
    <artifactId>rabbitmq-java-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>rabbitmq-java-client</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>4.0.2</version>
        </dependency>
    </dependencies>
</project>

2,通過rabbitClient創建一個新的exchange

 public static void main(String[] args) throws IOException, TimeoutException {

        //常見連接工廠
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");
//上述創建工廠的時候,配置factory信息比較繁瑣,有多種方式
//可以配置。

        //獲取連接
        Connection connection = factory.newConnection();

        //獲取channel,所有的操作都是在channel,一個connection可以創建多個channel
        Channel channel = connection.createChannel();

        channel.exchangeDeclare("logs","direct");

        channel.close();
        connection.close();
    }

結果如圖:


image.png

上圖的logs 是一個沒有任何features的exchange。

通過rabbitMQ的channel,exchange,queue,binding的創建,刪除,屬性等操作
package com.edu.mq.rabbitmq;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeoutException;

/**
 * 類說明:
 *
 * @author zhangkewei
 * @date 2018/11/21下午4:40
 */
public class App {

    public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {

        //常見連接工廠
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");

        //獲取連接
        Connection connection = factory.newConnection();

        //獲取channel,所有的操作都是在channel,一個connection可以創建多個channel
        Channel channel = connection.createChannel();


        /*****************************************  exchange開始   ********************************************/
        /**
         * exchange的一些操作,創建,刪除,是否存在,添加是否持久化,自動刪除,類型,alternate-exchange,其中重復創建
         * 已經存在的exchange是不會有問題的,當重復創建的時候,如果已經存在,不會在創建
         */
        channel.exchangeDeclare("logs", "direct");
        //通過枚舉的方式寫type,防止自己寫的時候,拼寫錯誤。
        channel.exchangeDeclare("log.info.first", BuiltinExchangeType.DIRECT);
        //其中的第三個參數表示是否持久化。
        AMQP.Exchange.DeclareOk declareOk = channel.exchangeDeclare("log.info.two", BuiltinExchangeType.DIRECT, true);

        //其中的第四個參數表示是否自動刪除。第五個參數表示是否給exchange 添加額外的exchange,當沒有路由到隊列的時候,消息轉發到log的exchange中。
        Map<String, Object> arguments = new HashMap();
        arguments.put("alternate-exchange", "log");
        channel.exchangeDeclare("log.warn", BuiltinExchangeType.DIRECT, true, false, arguments);

        //判斷某個exchange是否存在。
        channel.exchangeDeclare("log", BuiltinExchangeType.DIRECT);
        AMQP.Exchange.DeclareOk log = channel.exchangeDeclarePassive("log");
        System.out.println(log);
        //如果沒有會報錯
        // log = channel.exchangeDeclarePassive("log2");
        // System.out.println(log);

        // 刪除某個exchange,如果沒有這個這個exchange會報錯
        AMQP.Exchange.DeleteOk log1 = channel.exchangeDelete("log");
        /****************************************    exchange結束    *******************************************/

/*———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/
        /*****************************************  queue開始   ********************************************/

        //創建隊列(可以重復執行).如果已經有該隊列,而且該隊列有消息,這個時候創建也沒有問題,不會刪除原有的隊列中的消息

        //其中第一個參數是隊列名稱,第二個是是否持久化,第三個參數是是否是排他的(ture的時候,如果connection斷開,就會消失)
        //第四個參數表示是否持久化,第五個是隊列的一些屬性的設置,可以通過map設置
        channel.queueDeclare("debug_queue", true, false, false, null);
        //隊列是否存在,如果不存在會報錯。
        channel.queueDeclarePassive("debug_queue");
        /*****************************************  queue結束   ********************************************/

 /*———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————*/
        /*****************************************  binding開始   ********************************************/
        //綁定分為兩種,1,exchange和queue綁定。2,exchange和exchange綁定。都可以重復執行
        //將隊列綁定到exchange中,第一個參數是隊列名稱,第二個參數表示exchange名稱,第三個參數表示routingKey
        channel.queueBind("debug_queue","log.warn","info");
        channel.exchangeBind("log.warn","log.info","log");

        //逆向操作,解綁,可以重復執行
       // channel.queueUnbind("debug_queue","log.warn","info");
       // channel.exchangeUnbind("log.warn","log.info","log");
        /*****************************************  binding結束   ********************************************/

        /**
         * 以上的exchange,queue,binding都有異步的操作XXXNoWait方法,不等待執行結果。
         */

        Thread.sleep(5000L);
        channel.close();
        connection.close();
    }
}

執行上面代碼之后,結果如下:


創建的exchange信息
創建的隊列信息
隊列和exchange綁定
exchange和exchange綁定

提示:有些說明在代碼中。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 來源 RabbitMQ是用Erlang實現的一個高并發高可靠AMQP消息隊列服務器。支持消息的持久化、事務、擁塞控...
    jiangmo閱讀 10,398評論 2 34
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,868評論 18 139
  • rabbitMQ是一款基于AMQP協議的消息中間件,它能夠在應用之間提供可靠的消息傳輸。在易用性,擴展性,高可用性...
    點融黑幫閱讀 3,039評論 3 41
  • RabbitMQ 簡介 MQ 消息隊列,上承生產者,下接消費者。從生產者側獲取消息,然后將消息轉發給消費者。由此可...
    2205閱讀 3,538評論 1 11
  • 騎天大勝 焦點少年班堅持分享第332天 星期二 2018.6.12 最近我考試是這件事情所困擾,而且明天語文模擬測...
    騎天大勝閱讀 199評論 0 0