Demo下載地址:https://download.csdn.net/download/u010312811/11259742
.Net下操作RabbitMQ最常用的SDK是RabbitMQ.Client和EasyNetQ,EasyNetQ操作簡單,更容易上手。
相關文章很多,但是大都是翻譯自官方的Demo,一堆的控制台程序做消息【發布/訂閱】顯然不是我們在生產環境所期望的,所以本文以Asp.net MVC為例,介紹如何使用EasynetQ。
1.創建Asp.net MVC項目

項目結構如上圖所示,Services文件夾包含了消息隊列操作的相關接口,Models文件夾包含了測試需要用到的模型。
2.添加依賴
本文用到的組件包含:EasyNetQ、Autofac、NlLog。
添加依賴:
- Autofac、Autofac.Mvc5
- EasyNetQ
- NLog
其他的依賴如:RabbitMQ.Client、Newtonsoft.Json會自動添加,不需要單獨手動添加。
3.消息隊列接口

3.1 IMQService
1 public interface IMQService 2 { 3 void InitMQ(); 4 5 void PublishMessage<T>(T message) where T : class; 6 7 void SubscribeMessage(); 8 9 }
該接口中我們添加了三個接口:
- InitMQ:初始化消息隊列
- PublishMessage:消息發布
- SubscribeMessage:消息訂閱
3.2 RabbitMQService
1 public class RabbitMQService:IMQService 2 { 3 IBus bus; 4 5 public RabbitMQService() 6 { 7 8 } 9 public void InitMQ() 10 { 11 bus = RabbitHutch.CreateBus("host=localhost", x => x.Register<IConsumerErrorStrategy>(_ => new AlwaysRequeueErrorStrategy())); 12 13 //訂閱消息 14 SubscribeMessage(); 15 } 16 17 public void PublishMessage<T>(T message) 18 where T:class 19 { 20 bus.Publish<T>(message); 21 } 22 23 public void SubscribeMessage() 24 { 25 bus.SubscribeAsync<Question>("subscribe_question", x => HandleMessageAsync(x).Invoke(1)); 26 } 27 28 private Func<int,Task> HandleMessageAsync(Question question) 29 { 30 return async (id) => 31 { 32 if (new Random().Next(0, 2) == 0) 33 { 34 Console.WriteLine("Exception Happened!!!!"); 35 NLogHelper.Info("Exception Happened!!!!" + " " + question.Text); 36 throw new Exception("Error Hanppened!" + " " + question.Text); 37 } 38 else 39 { 40 NLogHelper.Info("BEGIN"); 41 Thread.Sleep(10000); 42 Console.WriteLine(string.Format("worker:{0},content:{1}", id, question.Text)); 43 NLogHelper.Info(string.Format("worker:{0},content:{1}", id, question.Text)); 44 } 45 }; 46 } 47 }
RabbitMQService是對消息隊列接口的實現,包含了隊列的初始化、發布、訂閱。
初始化方法僅需要在程序啟動時注冊一次
SubscribeMessage方法用於指明消息隊列的訂閱方法。本例中指明了對類型為 Question 的消息使用方法 HandleMessageAsync 處理。
4.測試

參考
https://github.com/EasyNetQ/EasyNetQ/issues/734
https://github.com/EasyNetQ/EasyNetQ/issues/504
https://blog.csdn.net/chenludaniel/article/details/86138288
