RabbitMQ學習筆記(五) Topic

2022-01-19 19:33:25 字數 1793 閱讀 9097

direct exchange幫助我們解決了分類發布與訂閱訊息的問題,但是direct exchange的問題是,它所使用的routingkey是乙個簡單字串,這決定了它只能按照乙個條件進行分類。

比如rabbitmq學習筆記(四)routing中的列子,我們是按照新聞的型別分類的,分為game, sport, music。

如果game下面有ff7,ff8的子分類,sport下面有soccer, basketball的分類。現在我們要求消費者程式接收game下面ff7子類別的所有新聞,sport下面的soccer子類別的所有新聞 ,以及所有的music新聞,單單使用direct exchange不能幫助我們解決這個問題。

topic exchange和direct exchange的用法基本一樣。

他們的區別是, topic exchange在指定routingkey的時候,必須使用乙個單詞列表,每個單詞之間用」.」間隔, 例如game.ff7, sport.soccer, topic exchange使用的routingkey的最大長度是256位元組。

而且在topic exchange的routingkey中可以使用2種萬用字元

你甚至可以這樣寫*.*.rabbit,表示所有3級新聞類別兔子的新聞,zoo.grass.rabbit和zoo.cage.rabbit都可以匹配

使用topic exchange

傳送訊息需要指定新聞分類 ,命令格式「dotnet run [分類路徑] [訊息資訊]」

static void main(string args)

;using (var connection = factory.createconnection())

news: ";

var body = encoding.utf8.getbytes(message);

channel.basicpublish(exchange: "topicexchange",

routingkey: messagetype,

basicproperties: null,

body: body

);console.writeline("[x] sent ", message);}}

}

static void main(string args)

;using (var connection = factory.createconnection())

var consumer = new eventingbasicconsumer(channel);

consumer.received += (model, ea) =>

", message);

};channel.basicconsume(queue: queuename, autoack: true, consumer: consumer);

console.read();}}

}

啟動乙個send程式,2個receive程式

乙個receive程式訂閱ff7下面的所有新聞(包含ff7下面所有的子類別新聞),soccer下面的所有新聞(包含soccer下面的所有子類別新聞),music下的所有新聞(不包括子類別新聞)

乙個receive程式訂閱ff8下面的所有新聞(包含ff8下面所有的子類別新聞),basketball下面的所有新聞(包含basketball下面的所有子類別新聞)。

RabbitMq學習筆記(五) Topic

receivetopicone 匹配規則1 宣告交換器和佇列 channel.exchangedeclare exchange name,topic string queuename channel.queuedeclare getqueue 路由關鍵字規則 string routingkeys n...

rabbitmq學習筆記一

首先我們先看rabbitmq原理圖 exchange交換器 接受訊息和路由訊息,然後將訊息傳送給訊息佇列。對於每乙個虛擬主機內部,交換器有獨一無二的名字 應用程式在其許可權範圍之內可以自由建立 共享 使用和銷毀交換例項。持久交換器可以使持久的 臨時的 或者自動刪除的。持久直到顯式刪除時消失 臨時交換...

RabbitMQ學習筆記1

博主從事網路程式設計3年了,但是說來慚愧的是,工作中沒有使用過訊息佇列。所以呢,打算從今天開始系統學習一些訊息佇列相關的知識,部落格也就作為筆記了。記錄一下自己的一些理解過程,有不對之處希望各位指出。生產者 消費者與訊息佇列 首先呢,訊息佇列不生產資料,他只是乙個資訊的搬運工具。資料由生產者提供,經...