《RabbitMQ系列教程-第四章-04-RabbitMQ工作模式之Routing路由模式》
技術標籤:# 《RabbitMQ系列教程》佇列交換機rabbitmqjavaqueue
RabbitMQ工作模式之Routing路由模式
4.4.1 簡介
剛剛我們說的Pub/Sub
訂閱模式中介紹了Exchange
,Exchange
有四種類型(direct
、topic
、headers
、fanout
),Pub/Sub
訂閱強調的是Fanout
型別的Exchange
,Routing
模式則強調的是Exchange
的direct
模式,Routing
模式也叫直連模式
;
Routing模式官網介紹:https://www.rabbitmq.com/tutorials/tutorial-four-java.html
4.4.2 生產者
package com.lscl.rabbitmq;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Producer04_Routing {
public static void main(String[] args) throws Exception {
// 建立連線工廠,用於獲取頻道channel
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.40.132");
factory.setPort(5672);
factory.setUsername("lscl");
factory.setPassword("admin");
factory.setVirtualHost ("/lscl");
// 2.建立連線
Connection connection = factory.newConnection();
// 3.建立頻道
Channel channel = connection.createChannel();
String exchangeName = "test_direct";
//5. 建立交換機(routing模式)
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,false,null);
//6. 建立佇列
String queue1Name = "test_direct_queue1";
String queue2Name = "test_direct_queue2";
channel.queueDeclare(queue1Name,true,false,false,null);
channel.queueDeclare(queue2Name,true,false,false,null);
//7. 繫結佇列和交換機
/*
queueBind(String queue, String exchange, String routingKey)
引數:
1. queue:佇列名稱
2. exchange:交換機名稱
3. routingKey:路由鍵,繫結規則
如果交換機的型別為fanout ,routingKey設定為""
*/
//佇列1繫結 red,green
channel.queueBind(queue1Name,exchangeName,"red");
channel.queueBind(queue1Name,exchangeName,"green");
//佇列2繫結 red,blue
channel.queueBind(queue2Name,exchangeName,"red");
channel.queueBind(queue2Name,exchangeName,"blue");
String body = "routing....";
//8. 傳送訊息(路由規則為red,很明顯兩個佇列都能接受到訊息)
channel.basicPublish(exchangeName,"red",null,body.getBytes());
//9. 釋放資源
channel.close();
connection.close();
}
}
執行完畢之後,檢視RabbitMQ UI面板,發現多了一個Exchange(test_direct)和兩個Queues(test_direct_queue1
、test_direct_queue2
)
4.4.3 消費者-1
package com.lscl.rabbitmq;
import com.rabbitmq.client.*;
import java.io.IOException;
public class Consumer05_Routing {
public static void main(String[] args) throws Exception{
// 建立連線工廠,用於獲取頻道channel
ConnectionFactory factory=new ConnectionFactory();
factory.setHost("192.168.40.132");
factory.setPort(5672);
factory.setUsername("lscl");
factory.setPassword("admin");
factory.setVirtualHost("/lscl");
// 2.建立連線
Connection connection = factory.newConnection();
// 3.建立頻道
Channel channel = connection.createChannel();
// 定義佇列
String queueName = "test_direct_queue1";
channel.queueDeclare(queueName,true,false,false,null);
// 接收訊息
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("body:"+new String(body));
}
};
// 接受queue1的訊息
channel.basicConsume(queueName,true,consumer);
// 不釋放資源,讓rabbitmq一直監聽
}
}
4.4.4 消費者-2
和消費者-1程式碼一樣,只是佇列名換了
String queueName = "test_direct_queue2";
4.4.5 Routing模式小結
在Routing
模式下(Exchange
型別為direct
,也叫直連模式)訊息的傳送會指定一個routing key
,Exchange會根據此routing Key
來路由到指定的Queues
,類似於拉了100人進微信群,但是你只想讓這100人裡面是部門主管的人接受到你的訊息(根據某些條件傳送訊息,微信暫時還沒有這個功能)
Routing模式也可有不同的範圍,感興趣的同學可以自己測試:
多個佇列繫結相同的routing key:當傳送的routing key為black時,那麼Q1和Q2都能夠接收到訊息
當傳送的routing key為error時,C1和C2都能夠消費訊息,當傳送的routing key為info、warning時,只有C2能夠消費訊息
下一篇:《RabbitMQ系列教程-第四章-05-RabbitMQ工作模式之Topics主題模式》