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.