NET操作RabbitMQ組件EasyNetQ

來源:互聯網
上載者:User

標籤:例子   comm   receive   net   預設的配置   publish   deb   except   pre   

NET操作RabbitMQ組件EasyNetQ使用中文簡版文檔。

 本文出自EasyNetQ官方文檔,內容為自己理解加翻譯。文檔地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Quick-Start

 EasyNetQ簡介 

  EasyNetQ是基於官方.NET組件RabbitMQ.Client 的又一層封裝,使用起來更加方便,開發人員不用關心具體隊列聲明,路由聲明等細節,幾句簡單代碼即可發送訊息到隊列,接收訊息也很簡單,下面將簡單介紹EasyNetQ的使用方法。不知道什麼是RabbitMQ?您可以關閉網頁了。

 安裝EasyNetQ 

  從NuGet上安裝即可,由於EasyNetQ是依賴RabbitMQ.Client所以,會同時安裝兩個dll。

 
PM> Install-Package EasyNetQ
 串連RabbitMQ 

  使用EasyNetQ串連RabbitMQ,是在應用程式啟動時建立一個IBus對象,並且,在應用程式關閉時釋放該對象。RabbitMQ串連是基於IBus介面的,當IBus中的方法被調用,串連才會開啟。建立一個IBus對象的方法如下:

 
var bus = RabbitHutch.CreateBus(“host=myServer;virtualHost=myVirtualHost;username=mike;password=topsecret”);
 

  根據上述代碼可以看出,連接字串中是基於Key/Value形式的,每個Key中間用分號(;)斷開。其中host是必須要寫的,其他的值都是可以不用寫,會採用預設的配置。串連中可能用到的Key如下:

 
  • host,host=localhost 或者host =192.168.1.102或者host=my.rabbitmq.com,如果用到叢集配置的話,那麼可以用逗號將服務地址隔開,例如host=a.com,b.com,c.com
  • virtualHost,虛擬機器主機,預設為‘/‘
  • username,使用者登入名稱
  • password,使用者登入密碼
  • requestedHeartbeat,心跳設定,預設是10秒
  • prefetchcount,預設是50
  • pubisherConfirms,預設為false
  • persistentMessages,訊息持久化,預設為true
  • product,產品名
  • platform,平台
  • timeout,預設為10秒
 

  關閉串連,可以使用 bus.Dispose();

 EasyNetQ日誌(Logging) 

  EasyNetQ提供了一個日誌介面 IEasyNetQLogger

 
public interface IEasyNetQLogger{   void DebugWrite(string format, params object[] args);   void InfoWrite(string format, params object[] args);   void ErrorWrite(string format, params object[] args);   void ErrorWrite(Exception exception);}
 

  內部預設用的是NullLogger,即什麼也不做,不記錄日誌。在測試的時候也可以用ConsoleLogger來顯示EasyNetQ運行中的各種資訊。不過一般在正式使用環境中,可以自訂日誌並實現IEasyNetQLogger介面。然後在RabbitHutch.CreateBus的重載方法中註冊想用的日誌類型。(日誌中會記錄串連RabbitMQ的過程和隊列建立細節等資訊,對於不懂RabbitMQ的同學,可能這些日誌沒有什麼意義)。代碼如下:

 
var logger = new MyLogger() // 繼承自 IEasyNetQLoggervar bus = RabbitHutch.CreateBus(“my connection”, x => x.Register<IEasyNetQLogger>(_ => logger));
 訊息發布(Publish) 

  EasyNetQ支援最簡單的訊息模式是發布和訂閱。發布訊息後,任意消費者可以訂閱該訊息,也可以多個消費者訂閱。並且不需要額外配置。首先,如上文中需要先建立一個IBus對象,然後,在建立一個可序列化的.NET對象。調用Publish方法即可。

 
var bus = RabbitHutch.CreateBus(...);
var message = new MyMessage { Text = "Hello Rabbit" };bus.Publish<MyMessage>(message);
 

  警告,Publish只顧發送訊息到隊列,但是不管有沒有消費端訂閱,所以,發布之後,如果沒有消費者,該訊息將不會被消費甚至丟失。

 訊息訂閱(Subscribe) 

  EasyNetQ提供了訊息訂閱,當調用Subscribe方法時候,EasyNetQ會建立一個用於接收訊息的隊列,不過與訊息發布不同的是,訊息訂閱增加了一個參數,subscribe_id.代碼如下:

 
bus.Subscribe<MyMessage>("my_subscription_id", msg => Console.WriteLine(msg.Text));
 

  第一個參數是訂閱id,另外一個是delegate參數,用於處理接收到的訊息。這裡要注意的是,subscribe_id參數很重要,假如開發人員用同一個subscribeid訂閱了同一種訊息類型兩次或者多次,RabbitMQ會以輪訓的方式給每個訂閱的隊列發送訊息。接收到之後,其他隊列就接收不到該訊息。如果用不同的subscribeid訂閱同一種訊息類型,那麼產生的每一個隊列都會收到該訊息。

 

  舉個例子:出庫發貨,我們有五個商品倉庫,每個倉庫的商品都是一樣的,假如來了一堆訂單,那麼我們需要五個倉庫共同工作,分別處理訂單。而同樣,總倉庫需要知道總出貨量,正常情況下,可以用每個倉庫的出貨量相加即可。不過如果我們在總倉庫也監聽商品訂單訊息,那麼,每次來訂單,總倉庫也都會收到一份,那麼可以作相應的統計了。

 

  需要注意的是,在收到訊息處理訊息時候,不要佔用太多的時間,會影響訊息的處理效率,所以,遇到佔用長時間的處理方法,最好用非同步處理。代碼如下:

 
bus.SubscribeAsync<MyMessage>("subscribe_async_test", message =>     new WebClient().DownloadStringTask(new Uri("http://localhost:1338/?timeout=500"))        .ContinueWith(task =>             Console.WriteLine("Received: ‘{0}‘, Downloaded: ‘{1}‘",                 message.Text,                 task.Result)));
 

  取消訂閱,可以用如下方法:

 
var subscriptionResult = bus.Subscribe<MyMessage>("sub_id", MyHandler);...subscriptionResult.Dispose();
 

  或者直接IBus.Dispose();

 訊息發送(Send)和接收(Receive) 

  與Publish/Subscribe略有不同的是,Send/Receive 可以自己定義隊列名稱。

 
bus.Send("my.queue", new MyMessage{ Text = "Hello Widgets!" });
 
bus.Receive<MyMessage>("my.queue", message => Console.WriteLine("MyMessage: {0}", message.Text));
 

  並且,也可以在同一個隊列上發送不同的訊息類型,Receive方法可以這麼寫:

 
bus.Receive("my.queue", x => x    .Add<MyMessage>(message => deliveredMyMessage = message)    .Add<MyOtherMessage>(message => deliveredMyOtherMessage = message));
 

  如果訊息到達隊列,但是沒有發現相應訊息類型的處理時,EasyNetQ會發送一條訊息到error隊列,並且,帶上一個異常資訊:No handler found for message type <message type>。與Subscribe類型,如果在同一個隊列,同一個訊息類型,多次調用Receive方法時,訊息會通過輪詢的形式發送給每個Receive端。

 訊息路由(Topic Based Routing) 

  Publish方法,可以加一個topic參數。

 
bus.Publish(message, "X.A");
 

  訊息訂閱者可以通過路由來過濾相應的訊息。

 

  * 匹配一個字元

 

  #匹配0個或者多個字元

 

  所以 X.A.2 會匹配到 "#", "X.#", "*.A.*" 但不會匹配 "X.B.*" 或者 "A". 當訊息訂閱需要用到topic時候,需要調用Subscribe的重載方法

 
bus.Subscribe("my_id", handlerOfXDotStar, x => x.WithTopic("X.*"));bus.Subscribe("my_id", handlerOfStarDotB, x => x.WithTopic("*.B"));
 

  上述這種方式,會將訊息輪詢發送給兩個訂閱者,如果只需要一個訂閱者的話,可以這麼調用:

 
bus.Subscribe("my_id", handler, x => x.WithTopic("X.*").WithTopic("*.B"));
 總結 

  以上就是EasyNetQ的一些基本用法了,是不是很簡單呢,就這麼輕鬆實現了訊息佇列的使用。當然,要深入內部還是有很多東西的。比如依賴注入,自訂EasyNetQ組件,RPC實現等。而且,他的源碼也是比較有參考價值的,相對於之前自己寫的基於RabbitMQ的封裝,自己的簡直是不能看呀。希望本文能給讀完的你帶來協助。

NET操作RabbitMQ組件EasyNetQ

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.