Asp.net MVC使用EasyNetQ操作RabbitMQ


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM