多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > RabbitMQ學習(一).NET Client之Send/Receive

RabbitMQ學習(一).NET Client之Send/Receive

來源:程序員人生   發布時間:2014-09-09 07:22:50 閱讀次數:3383次

  • 1 "Hello World!"

    The simplest thing that doessomething

    Python | Java | Ruby | PHP| C#

轉載請注明出處:jiq?欽's technical Blog

前言:流行的消息隊列主要有ZeroMQ(C++實現),ActiveMQ(Java實現),RabbitMQ(Erlang實現),MSMQ,Kafka,這里可以看到他們的一些評估信息:http://wiki.secondlife.com/wiki/Message_Queue_Evaluation_Notes 更多細節可以自行搜索。

Introduction


下面是RabbitMQ的一些術語:RabbitMQ是一個消息代理,實際上它從消息生產者接收消息,然后將其發送到消息消費者,在這之間可以根據特定規則對消息進行路由,緩沖,以及持久化等。

  • 生產僅僅意味著發送,一個發送消息的程序就稱為生產者,比作“P”。

  • 一個隊列也可以叫做郵箱,存在于RabbitMQ中,盡管消息會流過RabbitMQ以及你的應用程序,但是它僅僅會被存儲在隊列中。隊列沒有任何限制,你想存儲多少消息就可以存儲多少,多個生產者可以向一個消息隊列發送消息,多個消費者也可以嘗試從消息隊列中接收(取出)消息。隊列用下面的圖形表示:

  • 消費和接收的意思是相同的,一個消費者就是一個等待接收消息的程序,我們用“C“表示:

記住生產者,消費者以及消息隊列(Broker)不一定要存在于同一臺機器上,實際上多數情況下它們都不在同一臺機器上。

"Hello World"

(using the .NET/C# Client)

在這個部分將會用C#寫兩個程序,一個是生產者用于發送單個消息,一個是消費者用于接收消息,然后將其打印出來。我們不關注其中涉及到的.NET API的細節,集中注意力在一個簡單的”Hello world“的消息上面。

(P) -> [|||] -> (C)

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庫之后,就可以進行下面的代碼開發了:

Sending

(P) -> [|||]

我們將會編寫一個消息發送者程序Send.cs以及一個消息接收程序Receive.cs,發送者將會連接到RabbitMQ,發送一個消息然后退出。

Send.cs 中,我們需要引入下面命名空間:

using System; using RabbitMQ.Client; using System.Text;

其中connection對象抽象了socket連接,關注協議的版本協商以及驗證,這里我們連接到本地機器的RabbitMQ,所以HostName是localhost,如果我們想要連接到不同機器的broker,那么只需要將它的IP換成這個就可以。

接下來我們創建了channel對象,它幾乎完成所有的事情。

要發送一個消息,我們必須要首先聲明一個隊列,然后才能publish(發送)消息到這個隊列。

class Send { public static void Main() { var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { channel.QueueDeclare("hello", false, false, false, null); string message = "Hello World!"; var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish("", "hello", null, body); Console.WriteLine(" [x] Sent {0}", message); } } } }

聲明一個隊里是冪等的(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.

Receiving

消息發送者發送了消息之后,消息接收者將會被RabbitMQ進行消息推送,所以和消息發送者發送一個消息不同,消息接收者需要保持對消息的監聽,然后才能收到這個消息進行打印。

[|||] -> (C)

Receive.cs所需要引入的命名空間幾乎和Send.cs一樣:

using RabbitMQ.Client; using RabbitMQ.Client.Events; using System; using System.Text;

初始化部分和Send.cs基本一樣,也是打開connection和channel,然后聲明消費者將要消費的消息隊列。

記住接收者也需要先聲明隊列,因為它可能在發送者之前啟動,這個時候隊列可能不存在,是不能夠進行告訴RabbitMQ進行監聽的。

然后創建一個回調函數對象,因為消息會異步到達,所以我們告訴RabbitMQ server將消息隊列hello的消息推送給我們的同時,注冊了這個回調函數對象,讓其可以在消息到達時進行異步調用。

class Receive { public static void Main() { var factory = new ConnectionFactory() { HostName = "localhost" }; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { channel.QueueDeclare("hello", false, false, false, null); var consumer = new QueueingBasicConsumer(channel); channel.BasicConsume("hello", true, consumer); Console.WriteLine(" [*] Waiting for messages." + "To exit press CTRL+C"); while (true) { var ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue(); var body = ea.Body; var message = Encoding.UTF8.GetString(body); Console.WriteLine(" [x] Received {0}", message); } } } } }

QueueingBasicConsumer.Queue.Dequeue() 將會阻塞直到當前進程從RabbitMQ server接收到一個新的消息

Here's the whole Receive.cs class.

Putting it all together

你可以通過引用RabbitMQ 的.NET客戶端DLL來編譯這兩個文件,我們使用的是命令行(cmd.exe and csc)來進行編譯,你也可以使用Visual Studio.

$ csc /r:"RabbitMQ.Client.dll" Send.cs $ csc /r:"RabbitMQ.Client.dll" Receive.cs

Then run the executable

$ Send.exe

then, run the receiver:

$ Receive.exe

消息接收者將會打印消息發送者通過RabbitMQ發送的消息,消息接收者也會保持運行狀態,繼續等待接收消息。

假如你想要查看隊列情況,可以使用rabbitmqctl list_queues命令。

Hello World!


原文:http://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 日本黄色大片视频 | 欧美日韩国产不卡在线观看 | 国产中文99视频在线观看 | 国产欧美日韩精品一区二区三区 | 伊人亚洲 | 国产精品久久久久久久久久妇女 | 国产精品系列在线一区 | 亚洲视频在线观看免费视频 | 综合网自拍 | 宅男午夜在线 | 成人a网站 | 国产视频在线看 | 国产成人毛片亚洲精品不卡 | 国内自拍成人网在线视频 | 久久99中文字幕伊人 | yy6080私人啪啪 | 亚洲第一网站免费视频 | 亚洲欧美综合色区小说 | 欧美成人一区二区三区在线视频 | 伊人福利 | 国产麻豆精品在线观看 | 久久精品国产国语对白 | 叼嘿视频免费大全网站 | 1v1双性受整夜不拔bl | 午夜色站 | 一本久久精品一区二区 | 男人边吃奶边玩下面舒服 | 美国一级淫片 | 狠狠五月婷婷 | 国产亚洲综合成人91精品 | 三级视频网| 欧美韩日国产 | 欧美激情校园春色 | 欧美freesex8一10 | 日韩手机视频 | 九操网 | 日本爱爱免费视频 | 一级a毛片免费 | www.狠狠操 | 一级做a爰片久久毛片美女 一级做a爰片久久毛片欧美 | 国产精品福利自产拍网站 |