RabbitMQ消息隊列(二):"Hello, World"[轉]

2. Sending

第一個program send.cs:發送Hello world 到queue。正如我們在上篇文章提到的,你程序的第9行就是建立連接,第12行就是創建channel,第14行創建名字爲hello的queue。

複製代碼
 1 using System;
 2 using RabbitMQ.Client;
 3 using System.Text;
 4 
 5 class Send
 6 {
 7     public static void Main()
 8     {
 9         var factory = new ConnectionFactory() { HostName = "localhost" };
10         using (var connection = factory.CreateConnection())
11         {
12             using (var channel = connection.CreateModel())
13             {
14                 channel.QueueDeclare("hello", false, false, false, null);//hello是queue的名字
15                 string message = "Hello World!";
16                 var body = Encoding.UTF8.GetBytes(message);
17                 channel.BasicPublish("", "hello", null, body);//hello是routing key的名字
18                 Console.WriteLine(" [x] Sent {0}", message);
19             }
20         }
21     }
22 }
複製代碼

從架構圖可以看出,Producer只能發送到exchange,它是不能直接發送到queue的。

第17行:現在我們使用默認的exchange(名字是空字符)。這個默認的exchange允許我們發送給指定的queue。routing_key就是指定的queue名字。

3. Receiving

第二個program receive.cs 將從queue中獲取Message並且打印到屏幕。

複製代碼
 1 using RabbitMQ.Client;
 2 using RabbitMQ.Client.Events;
 3 using System;
 4 using System.Text;
 5 
 6 class Receive
 7 {
 8     public static void Main()
 9     {
10         var factory = new ConnectionFactory() { HostName = "localhost" };
11         using (var connection = factory.CreateConnection())
12         {
13             using (var channel = connection.CreateModel())
14             {
15                 channel.QueueDeclare("hello", false, false, false, null);//hello是queue的名字
16                 var consumer = new QueueingBasicConsumer(channel);
17                 channel.BasicConsume("hello", true, consumer);//hello是queue的名字,這裏可以理解爲hello是routing key的名字。因爲這個例子沒有使用指定名稱的exchange(實際上使用的是默認的exchange名字),所以queue的名字和routing key的名字是相同的。在第五篇文章中介紹如果使用了指定名稱的exchange,queue name和routing key的關係與用法。
18                 Console.WriteLine(" [*] Waiting for messages." + "To exit press CTRL+C");
19                 while (true)
20                 {
21                     var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//阻塞
22                     var body = ea.Body;
23                     var message = Encoding.UTF8.GetString(body);
24                     Console.WriteLine(" [x] Received {0}", message);
25                 }
26             }
27         }
28     }
29 }
複製代碼

4. 最終運行

先運行 send.cs ,send.cs 每次運行完都會停止。注意:現在數據已經存到queue裏了。在接收它receive.cs.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章