1. 程式人生 > 其它 >《RabbitMQ系列教程-第四章-04-RabbitMQ工作模式之Routing路由模式》

《RabbitMQ系列教程-第四章-04-RabbitMQ工作模式之Routing路由模式》

技術標籤:# 《RabbitMQ系列教程》佇列交換機rabbitmqjavaqueue

RabbitMQ工作模式之Routing路由模式

4.4.1 簡介

剛剛我們說的Pub/Sub訂閱模式中介紹了ExchangeExchange有四種類型(directtopicheadersfanout),Pub/Sub訂閱強調的是Fanout型別的ExchangeRouting模式則強調的是Exchangedirect模式,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_queue1test_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主題模式》