RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Ruby、.NET、Java,也是衆多消息隊列中表現不俗的一員,做用就是提升系統的併發性,將一些不須要及時響應客戶端且佔用較多資源的操做,放入隊列,再由另一個線程,去異步處理這些隊列,可極大的提升系統的併發能力。html
2.使用官網提供的c#操做類庫RabbitMQ.Client web
咱們先分別建立兩個控制檯程序 一個用來發送消息到rabbitmq 消息代理做爲何生產者;另一個從中讀取進行消費做爲消費者。c#
如:p表明生成者,c表明消費者,中間的部分表明消息隊列 服務器
生成者的代碼以下:併發
public static void RunSend() { ConnectionFactory connectionFactory = new ConnectionFactory() { HostName = "192.168.35.129", Port = 5672, Password = "123", UserName = "mquser" }; //創建鏈接rabbitmq 消息代理服務器。 using (IConnection conn = connectionFactory.CreateConnection()) { //建立Channel對象 using (IModel channel = conn.CreateModel()) { //聲明隊列 channel.QueueDeclare("hello", durable: false, exclusive: false, autoDelete: false, arguments: null); //消息 ,此處是簡單的字符串,你也能夠定義複雜的消息體 string msg = "Hello World"; var body = Encoding.UTF8.GetBytes(msg); //把消息放到隊列中 channel.BasicPublish(exchange:"", routingKey:"hello", basicProperties:null, body:body); Console.WriteLine("send {0}",msg); } } }
消費者的代碼以下:異步
public static void RunReceive() { ConnectionFactory connectionFactory = new ConnectionFactory() { HostName = "192.168.35.129", Port = 5672, Password = "123", UserName = "mquser" }; using (IConnection conn = connectionFactory.CreateConnection()) { using (IModel channel = conn.CreateModel()) { //注意:在 send.CS 中也聲明瞭隊列Hello,這裏爲何要再次聲明 //第一:QueueDeclare 實現了冪等性,建立的時候若是已經存在,就不會再次建立。 //第二:由於 兩邊都進行建立,不用考慮 生產者 和消費者 啓動的順序了。 channel.QueueDeclare("hello", durable: false, exclusive: false, autoDelete: false, arguments: null); //建立事件驅動的消費者類型;建議使用此種方式,不要使用while(true) //理由嗎 哈哈 看看王清培的博客吧。不穩定不優雅。。。 var consumer = new EventingBasicConsumer(channel); consumer.Received += (sender, e) => { var body = e.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] Received {0}", message); }; channel.BasicConsume(queue: "hello", noAck: true, consumer: consumer); Console.WriteLine(" Press [enter] to exit."); Console.ReadLine(); } } }
輸出spa
好了rabbitmq入門篇講完了,是否是很簡單。線程