日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

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

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

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

  • 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

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 五月婷婷在线观看 | 国产精品成人免费视频 | 久久精品夜夜夜夜夜久久 | 国产精品久久久久久久7电影 | 91看片淫黄大片在线天堂最新 | 日韩不卡在线视频 | 亚洲乱码国产乱码精品精98午夜 | 日韩毛片在线看 | 免费一区二区三区四区 | 国产精彩免费视频 | 国产精品久久久久久久久久免费动 | 男女涩涩网站 | 99re8在线精品视频免费播放 | av中文字幕一区二区 | 九九99久久| 自拍视频网站 | 久久99久久99 | 久久久久99| 玖玖精品视频 | 国产毛片精品 | 国产精品久久久久久妇女 | 国产精品久久久久久 | 久久精选视频 | 高清国产一区 | 欧美色图首页 | 日韩激情电影 | 久草成人| 国产日产欧美一区二区 | 国产一区二区自拍 | 免费成人高清 | 91久久久久久久久久久久久 | 性色av一区二区 | 国产日韩精品久久 | 免费看男女视频 | 国产做爰全过程免费的视频 | 视频在线二区 | 大陆性猛交xxxx乱大交 | 成年人在线观看视频 | www.99re| 成人18视频在线观看 | 国产精品一区二区三区免费视频 |