RabbitMQ学习系列 : C# 如何使用 RabbitMQ

上一篇已经讲了Rabbitmq如何在Windows平台安装,还不了解如何安装的朋友,请看我前面文章 , 今天就来聊聊 C# 实际开发的过程中,怎么调用 用RabbitMQ。


  一、客户端 

    RabbitMQ.Client 是rabbitmq 官方提供的的客户端,net 版本地址 :http://www.rabbitmq.com/dotnet.html 

    EasyNetQ 是基于RabbitMQ.Client 基础上封装的开源客户端。使用非常方便。地址:http://easynetq.com/ 。 本篇所使用示例代码下载地址:  demo示例下载 。

    RabbitMQ 还有很多其他客户端API,都非常的好用。我们在一边,一直用的都是 EasyNetQ,所以这里的 demo 只介绍 EasyNetQ 客户端实现。其他的客户端,大家自己去研究吧。

 

  二、项目结构

    

      说明:前面我们提到过,RabbitMQ由 Producer(生成者) 和 Consumer(消费者) 两部分组成。Weiz.Consumer 就是Consumer(消费者),Weiz. Producer 为 Producer(生成者),Weiz.MQ 为消息队列的通用处理类库。


  三、项目搭建

    1. Weiz.MQ 项目,消息队列的通用处理类库,用于正在的订阅和发布消息。

      1. 通过nuget安装项目EasyNetQ 相关组件, (略)

      2. 增加BusBuilder.cs管道创建类,主要负责链接Rabbitmq。

[csharp] view plain copy
print ?
  1. using System;  
  2. using System.Configuration;  
  3. using EasyNetQ;  
  4.   
  5. namespace Weiz.MQ  
  6. {  
  7.     /// <summary>  
  8.     /// 消息服务器连接器  
  9.     /// </summary>  
  10.     public class BusBuilder  
  11.     {  
  12.         public static IBus CreateMessageBus()  
  13.         {  
  14.             // 消息服务器连接字符串  
  15.             // var connectionString = ConfigurationManager.ConnectionStrings["RabbitMQ"];  
  16.             string connString = "host=192.168.98.107:5672;virtualHost=OrderQueue;username=zhangweizhong;password=weizhong1988";  
  17.             if (connString == null || connString == string.Empty)  
  18.             {  
  19.                 throw new Exception("messageserver connection string is missing or empty");  
  20.             }  
  21.               
  22.             return RabbitHutch.CreateBus(connString);  
  23.         }  
  24.     }  
  25. }  
using System;
using System.Configuration;
using EasyNetQ;

namespace Weiz.MQ
{
    /// <summary>
    /// 消息服务器连接器
    /// </summary>
    public class BusBuilder
    {
        public static IBus CreateMessageBus()
        {
            // 消息服务器连接字符串
            // var connectionString = ConfigurationManager.ConnectionStrings["RabbitMQ"];
            string connString = "host=192.168.98.107:5672;virtualHost=OrderQueue;username=zhangweizhong;password=weizhong1988";
            if (connString == null || connString == string.Empty)
            {
                throw new Exception("messageserver connection string is missing or empty");
            }
            
            return RabbitHutch.CreateBus(connString);
        }
    }
}


      3. 增加IProcessMessage类,定义了一个消息方法,用于消息传递

[csharp] view plain copy
print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace Weiz.MQ  
  7. {  
  8.     public interface IProcessMessage  
  9.     {  
  10.         void ProcessMsg(Message msg);  
  11.     }  
  12. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Weiz.MQ
{
    public interface IProcessMessage
    {
        void ProcessMsg(Message msg);
    }
}


      4. 增加Message类,定义了消息传递的实体属性字段等信息

[csharp] view plain copy
print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace Weiz.MQ  
  7. {  
  8.     public class Message  
  9.     {  
  10.         public string MessageID { getset; }  
  11.           
  12.         public string MessageTitle { getset; }  
  13.   
  14.         public string MessageBody { getset; }  
  15.   
  16.         public string MessageRouter { getset; }  
  17.     }  
  18. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Weiz.MQ
{
    public class Message
    {
        public string MessageID { get; set; }
        
        public string MessageTitle { get; set; }

        public string MessageBody { get; set; }

        public string MessageRouter { get; set; }
    }
}


      5. 增加MQHelper类,用于正在的订阅和发布消息。

 

[csharp] view plain copy
print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Configuration;  
  6.   
  7. using EasyNetQ;  
  8.   
  9. namespace Weiz.MQ  
  10. {  
  11.     public class MQHelper  
  12.     {  
  13.         /// <summary>  
  14.         /// 发送消息  
  15.         /// </summary>  
  16.         public static void Publish(Message msg)  
  17.         {  
  18.              创建消息bus  
  19.             IBus bus = BusBuilder.CreateMessageBus();  
  20.   
  21.             try  
  22.             {  
  23.                 bus.Publish(msg, x => x.WithTopic(msg.MessageRouter));  
  24.             }  
  25.             catch (EasyNetQException ex)  
  26.             {  
  27.                 //处理连接消息服务器异常   
  28.             }  
  29.   
  30.             bus.Dispose();//与数据库connection类似,使用后记得销毁bus对象  
  31.         }  
  32.   
  33.         /// <summary>  
  34.         /// 接收消息  
  35.         /// </summary>  
  36.         /// <param name="msg"></param>  
  37.         public static void Subscribe(Message msg, IProcessMessage ipro)  
  38.         {  
  39.              创建消息bus  
  40.             IBus bus = BusBuilder.CreateMessageBus();  
  41.   
  42.             try  
  43.             {  
  44.                 bus.Subscribe<Message>(msg.MessageRouter, message => ipro.ProcessMsg(message), x => x.WithTopic(msg.MessageRouter));  
  45.   
  46.             }  
  47.             catch (EasyNetQException ex)  
  48.             {  
  49.                 //处理连接消息服务器异常   
  50.             }  
  51.         }  
  52.     }  
  53. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

using EasyNetQ;

namespace Weiz.MQ
{
    public class MQHelper
    {
        /// <summary>
        /// 发送消息
        /// </summary>
        public static void Publish(Message msg)
        {
             创建消息bus
            IBus bus = BusBuilder.CreateMessageBus();

            try
            {
                bus.Publish(msg, x => x.WithTopic(msg.MessageRouter));
            }
            catch (EasyNetQException ex)
            {
                //处理连接消息服务器异常 
            }

            bus.Dispose();//与数据库connection类似,使用后记得销毁bus对象
        }

        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="msg"></param>
        public static void Subscribe(Message msg, IProcessMessage ipro)
        {
             创建消息bus
            IBus bus = BusBuilder.CreateMessageBus();

            try
            {
                bus.Subscribe<Message>(msg.MessageRouter, message => ipro.ProcessMsg(message), x => x.WithTopic(msg.MessageRouter));

            }
            catch (EasyNetQException ex)
            {
                //处理连接消息服务器异常 
            }
        }
    }
}

 

    2. RabbitMQ由 Producer(生成者)

      1. 创建一个aspx 页面,增加如下代码

[csharp] view plain copy
print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.UI;  
  6. using System.Web.UI.WebControls;  
  7.   
  8. using Weiz.MQ;  
  9.   
  10. namespace Weiz.Producer  
  11. {  
  12.     public partial class TestMQ : System.Web.UI.Page  
  13.     {  
  14.         protected void Page_Load(object sender, EventArgs e)  
  15.         {  
  16.   
  17.         }  
  18.   
  19.         protected void Button1_Click(object sender, EventArgs e)  
  20.         {  
  21.             Message msg = new Message();  
  22.             msg.MessageID = "1";  
  23.             msg.MessageBody = DateTime.Now.ToString();  
  24.             msg.MessageTitle = "1";  
  25.             msg.MessageRouter = "pcm.notice.zhangsan";  
  26.             MQHelper.Publish(msg);  
  27.   
  28.         }  
  29.     }  
  30. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Weiz.MQ;

namespace Weiz.Producer
{
    public partial class TestMQ : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            Message msg = new Message();
            msg.MessageID = "1";
            msg.MessageBody = DateTime.Now.ToString();
            msg.MessageTitle = "1";
            msg.MessageRouter = "pcm.notice.zhangsan";
            MQHelper.Publish(msg);

        }
    }
}


    3. Weiz.Consumer 就是Consumer(消费者)

      1 . 新增OrderProcessMessage.cs

[csharp] view plain copy
print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5.   
  6. namespace Weiz.Consumer  
  7. {  
  8.     public class OrderProcessMessage:MQ.IProcessMessage  
  9.     {  
  10.         public void ProcessMsg(MQ.Message msg)  
  11.         {  
  12.             Console.WriteLine(msg.MessageBody);  
  13.         }  
  14.     }  
  15. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Weiz.Consumer
{
    public class OrderProcessMessage:MQ.IProcessMessage
    {
        public void ProcessMsg(MQ.Message msg)
        {
            Console.WriteLine(msg.MessageBody);
        }
    }
}


      2. Program 增加如下代码

[csharp] view plain copy
print ?
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6.   
  7. namespace Weiz.Consumer  
  8. {  
  9.     class Program  
  10.     {  
  11.         static void Main(string[] args)  
  12.         {  
  13.             OrderProcessMessage order = new OrderProcessMessage();  
  14.             MQ.Message msg = new MQ.Message();  
  15.             msg.MessageID = "1";  
  16.             msg.MessageRouter = "pcm.notice.zhangsan";  
  17.   
  18.             MQ.MQHelper.Subscribe(msg, order);  
  19.         }  
  20.     }  
  21. }  
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Weiz.Consumer
{
    class Program
    {
        static void Main(string[] args)
        {
            OrderProcessMessage order = new OrderProcessMessage();
            MQ.Message msg = new MQ.Message();
            msg.MessageID = "1";
            msg.MessageRouter = "pcm.notice.zhangsan";

            MQ.MQHelper.Subscribe(msg, order);
        }
    }
}


 

  四、运行

     1. 启动 Weiz.Consumer (消费者),启动消费者,会自动在RabbitMQ 服务器上创建相关的exchange 和 queue 。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值