《RabbitMQ系列教程-第四章-05-RabbitMQ工作模式之Topics主題模式》
阿新 • • 發佈:2021-01-06
技術標籤:# 《RabbitMQ系列教程》佇列交換機rabbitmqjavaqueue
RabbitMQ工作模式之Topics主題模式
4.5.1 簡介
在Routing
模式下,一個Exchange
繫結Queues
時可以指定Routing Key
,但Routing Key
都是固定的值,如果想要萬用字元的匹配(類似於模糊匹配)我們就得使用Topics
模式了,例如red
開頭的Routing key
我都進行訊息路由,以green
結尾的Routing key
的我都進行訊息路由等;
Topics
模式強調的是topic
模式的Exchange
,Topics模式也叫主題模式,該模式下的Exchange
Queues
時可以指定的一定的萬用字元,這些萬用字元指定了路由的規則;
Topics
模式下有兩個符號:
-
符號
#
:匹配零個或多個詞。(0個或多個) -
符號
*
:匹配不多不少一個詞。(必須是一個,0個不行)
因此 red.#
能夠匹配到 red.green.xxx
,但是 red.*
只會匹配到 red.xxx
。
小練習:
red.green.green 1/2/3/4 green.green 3/4 green.red.blue green.green.green 3/4 green.red.green 3 red.#.green red.green.* #.green *.green.#
Topics模式官網介紹:https://www.rabbitmq.com/tutorials/tutorial-five-java.html
4.5.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 Producer05_Topic {
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_topic";
//5. 建立交換機
channel.exchangeDeclare(exchangeName, BuiltinExchangeType.TOPIC,true,false,false,null);
//6. 建立佇列
String queue1Name = "test_topic_queue1";
String queue2Name = "test_topic_queue2";
String queue3Name = "test_topic_queue3";
String queue4Name = "test_topic_queue4";
channel.queueDeclare(queue1Name,true,false,false,null);
channel.queueDeclare(queue2Name,true,false,false,null);
channel.queueDeclare(queue3Name,true,false,false,null);
channel.queueDeclare(queue4Name,true,false,false,null);
//7. 繫結佇列和交換機
channel.queueBind(queue1Name,exchangeName,"red.#.green");
channel.queueBind(queue2Name,exchangeName,"red.green.*");
channel.queueBind(queue3Name,exchangeName,"#.green");
channel.queueBind(queue4Name,exchangeName,"*.green.#");
String body = "topic....";
//8. 傳送訊息
/*
red.green.green 1/2/3/4
green.green 3/4
green.red.blue
green.green.green 3/4
green.red.green 3
red.#.green
red.green.*
#.green
*.green.#
*/
// channel.basicPublish(exchangeName,"red.green.green",null,body.getBytes());
// channel.basicPublish(exchangeName,"green.green",null,body.getBytes());
// channel.basicPublish(exchangeName,"green.red.blue",null,body.getBytes());
// channel.basicPublish(exchangeName,"green.green.green",null,body.getBytes());
channel.basicPublish(exchangeName,"green.red.green",null,body.getBytes());
//9. 釋放資源
channel.close();
connection.close();
}
}
4.5.3 消費者-1
package com.lscl.rabbitmq;
import com.rabbitmq.client.*;
import java.io.IOException;
public class Consumer07_Topic_01 {
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_topic_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));
}
};
// 接受queue的訊息
channel.basicConsume(queueName,true,consumer);
// 不釋放資源,讓rabbitmq一直監聽
}
}
4.5.4 消費者-2
和消費者-1程式碼一樣,只是佇列名換了
String queueName="test_topic_queue2";
4.5.5 消費者-3
和消費者-1程式碼一樣,只是佇列名換了
String queueName="test_topic_queue3";
4.5.6 消費者-4
和消費者-1程式碼一樣,只是佇列名換了
String queueName="test_topic_queue4";
4.5.7 Topics模式小結
在Topics
下(Exchange
型別為topic
,也叫主題模式),Routing Key
的用法更加豐富,主要有#
、*
兩個符號,#
號可以匹配0個或多個詞,*
號可以匹配任意個詞,包括0個;