The simplest thing that doessomething
Python | Java | Ruby | PHP| C#
下面是RabbitMQ的一些術語:RabbitMQ是一個消息代理,實際上它從消息生產者接收消息,然后將其發送到消息消費者,在這之間可以根據特定規則對消息進行路由,緩沖,以及持久化等。
生產僅僅意味著發送,一個發送消息的程序就稱為生產者,比作“P”。
一個隊列也可以叫做郵箱,存在于RabbitMQ中,盡管消息會流過RabbitMQ以及你的應用程序,但是它僅僅會被存儲在隊列中。隊列沒有任何限制,你想存儲多少消息就可以存儲多少,多個生產者可以向一個消息隊列發送消息,多個消費者也可以嘗試從消息隊列中接收(取出)消息。隊列用下面的圖形表示:
消費和接收的意思是相同的,一個消費者就是一個等待接收消息的程序,我們用“C“表示:
記住生產者,消費者以及消息隊列(Broker)不一定要存在于同一臺機器上,實際上多數情況下它們都不在同一臺機器上。
在這個部分將會用C#寫兩個程序,一個是生產者用于發送單個消息,一個是消費者用于接收消息,然后將其打印出來。我們不關注其中涉及到的.NET API的細節,集中注意力在一個簡單的”Hello world“的消息上面。
The .NET client library
RabbitMQ speaks AMQP, which is an open, general-purpose protocol for messaging. There are a number of clients for AMQP in many different languages. We'll use the .NET client provided by RabbitMQ.
Download the client library package, and check its signature as described. Extract it and copy "RabbitMQ.Client.dll" to your working folder.
You also need to ensure your system can find the C# compiler csc.exe, you may need to add ;C:WINDOWSMicrosoft.NETFrameworkv3.5 (change .NET version to fit your installation) to your Path.
有了Rabbit的.NET client庫之后,就可以進行下面的代碼開發了:
我們將會編寫一個消息發送者程序Send.cs以及一個消息接收程序Receive.cs,發送者將會連接到RabbitMQ,發送一個消息然后退出。
在Send.cs 中,我們需要引入下面命名空間:
其中connection對象抽象了socket連接,關注協議的版本協商以及驗證,這里我們連接到本地機器的RabbitMQ,所以HostName是localhost,如果我們想要連接到不同機器的broker,那么只需要將它的IP換成這個就可以。
接下來我們創建了channel對象,它幾乎完成所有的事情。
要發送一個消息,我們必須要首先聲明一個隊列,然后才能publish(發送)消息到這個隊列。
聲明一個隊里是冪等的(idempotent),也就是說僅僅在這個隊列不存在的情況加,才會進行隊列的創建操作。
消息內容是字節數組,所以在這里你需要進行編碼,可以使用任何你喜歡的編碼手段。
上面代碼跑完之后,connection和channel對象會自動被清理(disposed)。
Here's the whole Send.cs class.
Sending doesn't work!
If this is your first time using RabbitMQ and you don't see the "Sent" message then you may be left scratching your head wondering what could be wrong. Maybe the broker was started without enough free disk space (by default it needs at least 50 MB free) and is therefore refusing to accept messages. Check the broker logfile to confirm and reduce the limit if necessary. The configuration file documentation will show you how to setdisk_free_limit.
消息發送者發送了消息之后,消息接收者將會被RabbitMQ進行消息推送,所以和消息發送者發送一個消息不同,消息接收者需要保持對消息的監聽,然后才能收到這個消息進行打印。
Receive.cs所需要引入的命名空間幾乎和Send.cs一樣:
初始化部分和Send.cs基本一樣,也是打開connection和channel,然后聲明消費者將要消費的消息隊列。
記住接收者也需要先聲明隊列,因為它可能在發送者之前啟動,這個時候隊列可能不存在,是不能夠進行告訴RabbitMQ進行監聽的。
然后創建一個回調函數對象,因為消息會異步到達,所以我們告訴RabbitMQ server將消息隊列hello的消息推送給我們的同時,注冊了這個回調函數對象,讓其可以在消息到達時進行異步調用。
QueueingBasicConsumer.Queue.Dequeue() 將會阻塞直到當前進程從RabbitMQ server接收到一個新的消息
Here's the whole Receive.cs class.
你可以通過引用RabbitMQ 的.NET客戶端DLL來編譯這兩個文件,我們使用的是命令行(cmd.exe and csc)來進行編譯,你也可以使用Visual Studio.
Then run the executable
then, run the receiver:
消息接收者將會打印消息發送者通過RabbitMQ發送的消息,消息接收者也會保持運行狀態,繼續等待接收消息。
假如你想要查看隊列情況,可以使用rabbitmqctl list_queues命令。
Hello World!
原文:http://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html