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

转载于:https://www.cnblogs.com/imstrive/p/11078335.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ASP.NET MVC使用消息队列可以通过RabbitMQ来实现。在ASP.NET MVC使用消息队列的步骤如下: 1. 在MessageController类中注入IModel实例,并在SendMessage方法中使用BasicPublish方法发送消息到队列。具体代码如下: ```csharp [Route("api/[controller]")] [ApiController] public class MessageController : ControllerBase { private readonly IModel _rabbitMQChannel; private readonly RabbitMQOptions _rabbitMQOptions; public MessageController(IModel rabbitMQChannel, IOptions<RabbitMQOptions> rabbitMqOptions) { _rabbitMQChannel = rabbitMQChannel; _rabbitMQOptions = rabbitMqOptions.Value; } [HttpPost] public IActionResult SendMessage([FromBody] string message) { var body = Encoding.UTF8.GetBytes(message); _rabbitMQChannel.BasicPublish( exchange: "", routingKey: _rabbitMQOptions.QueueName, basicProperties: null, body: body); return Ok(); } } ``` 2. 在Startup.cs文件的ConfigureServices方法中,进行RabbitMQ配置信息的注册。具体代码如下: ```csharp public void ConfigureServices(IServiceCollection services) { // ... services.Configure<RabbitMQOptions>(Configuration.GetSection("RabbitMQ")); // 注册RabbitMQ连接和通道 services.AddSingleton<IConnection>(provider => { var options = provider.GetRequiredService<IOptions<RabbitMQOptions>>().Value; var factory = new ConnectionFactory { HostName = options.Host, Port = options.Port, UserName = options.User, Password = options.Password }; return factory.CreateConnection(); }); services.AddScoped<IModel>(provider => { var connection = provider.GetRequiredService<IConnection>(); return connection.CreateModel(); }); // ... } ``` 以上是在ASP.NET MVC使用消息队列的步骤。通过使用RabbitMQ,你可以在ASP.NET MVC应用程序中轻松实现消息队列的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值