zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ActionMQ
    解决Session共享
    Linux中使用keepalived高可用工具解决宕机问题
    Linux安装Nginx
    Nginx基础
    多线程(1)
    单例模式1(3)
    创建型模式5种(2)
    7原则(1)
    反射使用案例(2)
  • 原文地址:https://www.cnblogs.com/imstrive/p/11078335.html
Copyright © 2011-2022 走看看