快速閱讀
介紹exchange的topic類型埋酬,和Direct類型相似胳螟,但是增加了"."和"#"的匹配。比Direct類型靈活
Topic消息類型
特點(diǎn)是:topic消息類型不能是任意的routing key, 必須是有點(diǎn)"."組成的單詞列表。
和dirct類似层宫,最后也是也相應(yīng)的key進(jìn)行匹配
例如:speed.color.sepcies
注意可以用號(hào)和#號(hào)出現(xiàn),和我們?nèi)粘S玫恼齽t表達(dá)式含義相近*
"*"號(hào)代表任意一個(gè)單詞
"#"號(hào)代表0個(gè)或多個(gè)單詞
生產(chǎn)者代碼
- 創(chuàng)建連接和信道
- 聲明exchange類型
- 設(shè)置兩個(gè)routingkey 各自發(fā)送兩次其监。一共發(fā)送四條消息
static void Main(string[] args)
{
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "topicType", type: "topic");
var list = new List<string>();
list.Add("www.baidu.com");
list.Add("www.google.com");
for (var i = 0; i < 2; i++)
{
var routingKey = list[0];
string message = "Hello World!this message routingkey is " + routingKey;
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
channel.BasicPublish(exchange: "topicType",
routingKey: routingKey,
basicProperties: null,
body: body);
Console.WriteLine(" [x] Sent {0},id={1}", message,i);
Thread.Sleep(1000);
}
for (var i = 0; i < 2; i++)
{
var routingKey = list[1];
string message = "Hello World!this message routingkey is " + routingKey;
var body = Encoding.UTF8.GetBytes(message);
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
channel.BasicPublish(exchange: "topicType",
routingKey: routingKey,
basicProperties: null,
body: body);
Console.WriteLine(" [x] Sent {0},id={1}", message, i);
Thread.Sleep(1000);
}
}
Console.WriteLine(" Press [enter] to exit.");
Console.ReadLine();
}
消費(fèi)者代碼
- 創(chuàng)建連接和信道
- 為了測(cè)試 topic 類型萌腿,限制輸入中含 有baidu,google兩個(gè)關(guān)鍵詞和發(fā)送的routing key相匹配。
- 聲明交換器類型
- 隊(duì)列聲明
- 把exchange和隊(duì)列綁定到信道上
- 接受消息
static void Main(string[] args)
{
bool flag = true;
string level = "";
while (flag)
{
Console.WriteLine("請(qǐng)選擇要查看的消息類型");
level = Console.ReadLine();
if (level.IndexOf(".baidu.")>0 || level.IndexOf(".google.") > 0 )
flag = false;
else
Console.Write("不支持你輸入的消息");
}
var factory = new ConnectionFactory() { HostName = "localhost" };
using (var connection = factory.CreateConnection())
{
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchange: "topicType", type: "topic");
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName, exchange: "topicType", routingKey: level);
//以下是區(qū)別生產(chǎn)者的
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (sender, e) =>
{
var body = e.Body;
var message = Encoding.UTF8.GetString(body);
var rk = e.RoutingKey;
Console.WriteLine("Received {0},routingKey:{1}", message, rk);
Thread.Sleep(3000);//模擬耗時(shí)任務(wù) 抖苦,
Console.WriteLine("Received over");
channel.BasicAck(deliveryTag: e.DeliveryTag, multiple: false);
};
channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
Console.WriteLine("");
Console.ReadLine();
}
}
測(cè)試結(jié)果
我們啟動(dòng)消費(fèi)者以后毁菱,輸入四個(gè)routingkey去測(cè)試
分別是
.google.#, #.google. , *.google.com, *.baidu.com
分別監(jiān)聽中間是google 或者baidu的消息
結(jié)果符合要求
image