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綁定
提示:有些說明在代碼中。