NET下RabbitMQ实践 [示例篇]

在上一篇文章中,介绍了在window环境下安装erlang,rabbitmq-server,以免配置用户,权限,虚拟机等内容。今天将会介绍如果使用rabbitmq进行简单的消息入队,出队操作,因为本文演示的环境要用到上文中配置的环境,所以要运行本文sample,请先按上一篇中完成相应环境配置。  
      首先,我们下载官方的.net客户端软件,链接:http://www.rabbitmq.com/dotnet.html。下载并安装之后,将安装目录下的这两个DLL文件复制到我们示例项目中,并添加引用:

RabbitMQ.
Client.dll //基于的发布订阅消息的功能类   

RabbitMQ.ServiceModel.dll //包括基于WCF方式发布订阅服务模型类

如下图:          接着,我们创建两个类,一个是ProducerMQ.cs(用于产生消息),一个是CustmerMq.cs(用于消费消息),代码如下:  
       首先是ProducerMQ:

public class ProducerMQ

{

    public static  void InitProducerMQ()

    {

        Uri uri = new Uri("amqp://10.0.4.85:5672/");

        string exchange = "ex1";

        string exchangeType = "direct";

        string routingKey = "m1";

        bool persistMode = true;

        Connection
Factory cf = new ConnectionFactory();

      

        cf.UserName = "daizhj";

        cf.Password = "617595";

        cf.VirtualHost = "dnt_mq";

        cf.RequestedHeartbeat = 0;

        cf.Endpoint = new AmqpTcpEndpoint(uri);

        using (IConnection conn = cf.CreateConnection())

        {

            using (IModel ch = conn.CreateModel())

            {

                if (exchangeType != null)

                {

                    ch.ExchangeDeclare(exchange, exchangeType);//,true,true,false,false, true,null);

                    ch.QueueDeclare("q1", true);//true, true, true, false, false, null);

                    ch.QueueBind("q1", "ex1", "m1", false, null); 

                }

                IMapMessageBuilder b = new MapMessageBuilder(ch);

                IDictionary target = b.Headers;

                target["header"] = "hello world";

                IDictionary targetBody = b.Body;

                targetBody["body"] = "daizhj";

                if (persistMode)

                {

                    ((IBasicProperties)b.GetContentHeader()).DeliveryMode = 2;

                }

             

                ch.BasicPublish(exchange, routingKey,

                                           (IBasicProperties)b.GetContentHeader(),

                                           b.GetContentBody());

}

        }

    }

}

  下面对上面代码进行说明:
  1.  定义要链接的rabbitmq-server地址(基于amqp协议):

Uri uri = new Uri("amqp://10.0.4.85:5672/");

  2.  定义交换方式

string exchange = "ex1";

string exchangeType = "direct";

string routingKey = "m1";

  说明:rabbitmq交换方式分为三种,分别是:
  Direct Exchange – 处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。如果一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。
  Fanout Exchange – 不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。Fanout交换机转发消息是最快的。
  Topic Exchange – 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。因此“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”。
  更多内容参见:RabbitMQ 三种Exchange  
  3. 是否对消息队列持久化保存

bool persistMode = true;

  4. 使用ConnectionFactory创建连接,虽然创建时指定了多个server address,但每个connection只与一个物理的server进行连接。

ConnectionFactory cf = new ConnectionFactory();    

        //使用前文的配置环境信息  

        cf.UserName = "daizhj"; 

        cf.Password = "617595";

        cf.VirtualHost = "dnt_mq";

        cf.RequestedHeartbeat = 0;

        cf.Endpoint = new AmqpTcpEndpoint(uri);

5. 实例化IConnection对象,并设置交换方式:

using (IConnection conn = cf.CreateConnection())

            {

                using (IModel ch = conn.CreateModel())

                {

                    if (exchangeType != null)

                    {

                        ch.ExchangeDeclare(exchange, exchangeType);//,true,true,false,false, true,null);

                        ch.QueueDeclare("q1", true);//true, true, true, false, false, null);

                        ch.QueueBind("q1", "ex1", "m1", false, null); 

                    }

        ....

  6. 构造消息实体对象并发布到消息队列上:

IMapMessageBuilder b = new MapMessageBuilder(ch);

  IDictionary target = b.Headers;

  target["header"] = "hello world";

  IDictionary targetBody = b.Body;

  targetBody["body"] = "daizhj";

  if (persistMode)

  {

    ((IBasicProperties)b.GetContentHeader()).DeliveryMode = 2;

  }

  //简单发布方式

  ch.BasicPublish(exchange, routingKey,

          (IBasicProperties)b.GetContentHeader(),

          b.GetContentBody());

  这样就完成了单条消息的发布。 下面是CustmerMq.cs(用于消费消息)实例代码:

public class CustmerMq

    {

        public static int InitCustmerMq()

        {

            string exchange = "ex1";

            string exchangeType = "direct";

            string routingKey = "m1";

string serverAddress = "10.0.4.85:5672";

            ConnectionFactory cf = new ConnectionFactory();

            cf.Address = serverAddress;

            cf.UserName = "daizhj";

            cf.Password = "617595";

            cf.VirtualHost = "dnt_mq";

            cf.RequestedHeartbeat = 0;

  可以看出上面的代码与 ProducerMQ的开头代码类似,下面使用ConnectionFactory来构造链接并接收队列消息:

using (IConnection conn = cf.CreateConnection())

            {

                using (IModel ch = conn.CreateModel())

                {

                    //普通使用方式BasicGet

                    //noAck = true,不需要回复,接收到消息后,queue上的消息
就会清除

                    //noAck = false,需要回复,接收到消息后,queue上的消息不会被清除,直到调用channel.basicAck(deliveryTag, false); queue上的消息才会被清除

时间: 2024-07-29 22:05:24

NET下RabbitMQ实践 [示例篇]的相关文章

NET下RabbitMQ实践 [配置篇]

这个系列目前计划写四篇,分别是配置,示例,WCF发布,实战.当然不排除加餐情况. 介绍: rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. RabbitMQ的官方站:http://www.rabbitmq.com/          AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路层协议,而不是API(例如JMS),AM

一起谈.NET技术,NET下RabbitMQ实践 [配置篇]

     这个系列目前计划写四篇,分别是配置,示例,WCF发布,实战.当然不排除加餐情况.      介绍:      rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器.      RabbitMQ的官方站:http://www.rabbitmq.com/          AMQP(高级消息队列协议) 是一个异步消息传递所使用的应用层协议规范,作为线路

NET 下RabbitMQ实践 [实战篇]

之前的文章中,介绍了如何将RabbitMQ以WCF方式进行发布.今天就介绍一下我们产品中如何使用RabbitMQ的! 在Discuz!NT企业版中,提供了对HTTP错误日志的记录功能,这一点对企业版非常重要,另外存储错误日志使用了MongoDB,理由很简单,MongoDB的添加操作飞快,即使数量过亿之后插入速度依旧不减.     在开始正文之前,先说明一下本文的代码分析顺序,即:程序入口==>RabbitMQ客户端===>RabbitMQ服务端.好了,闲话少说,开始正文!     首先是程序入

NET下RabbitMQ实践 [WCF发布篇]

在之前的两篇文章中,主要介绍了RabbitMQ环境配置,简单示例的编写.今天将会介绍如何使用WCF将RabbitMQ列队以服务的方式进行发布. 注:因为RabbitMQ的官方.net客户端中包括了WCF的SAMPLE代码演示,很适合初学者,所以我就偷了个懒,直接对照它的SAMPLE来说明了,算是借花献佛吧,呵呵.首先我们下载相应源码(基于.NET 3.0),本文主要对该源码包中的代码进行讲解,链接如下:    Binary, compiled for .NET 3.0 and newer (zi

一起谈.NET技术,NET下RabbitMQ实践 [WCF发布篇]

在之前的两篇文章中,主要介绍了RabbitMQ环境配置,简单示例的编写.今天将会介绍如何使用WCF将RabbitMQ列队以服务的方式进行发布. 注:因为RabbitMQ的官方.net客户端中包括了WCF的SAMPLE代码演示,很适合初学者,所以我就偷了个懒,直接对照它的SAMPLE来说明了,算是借花献佛吧,呵呵.首先我们下载相应源码(基于.NET 3.0),本文主要对该源码包中的代码进行讲解,链接如下:    Binary, compiled for .NET 3.0 and newer (zi

jquery取消选择select下拉框示例代码

 本篇文章主要是对jquery取消选择select下拉框示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 有三个select下拉框 一个大类,两个小类隐藏,需要在选择大类的时候,小类显示同时清除另外的小类选择的项 这需求有点儿..........   下面是三个select:   代码如下: <select name="pWaqqqy" id="sel_type" onchange="selectFunction()">

Angularjs实现带查找筛选功能的select下拉框示例代码_AngularJS

前言 对于select的下拉列表,像国家选择这样的功能,全世界那么多国家,一直拉滚动条多辛苦,眼睛也要盯着找,累!所以为优化用户体验,带查找功能的下拉框是非常非常有必要的.都知道jquery里有这样的插件,但我们用的是Angularjs,更希望用双向绑定,指令的方式优雅地解决这个问题. 分析 我们的目标是在原来的<select ng-options="">标签上新加一个属性 select-search 就能支持查找的功能.如果这个属性没起作用,也不影响原来的select的功

:Windows下RabbitMQ安装及入门

1.Windows下安装RabbitMQ需要以下几个步骤    (1):下载erlang,原因在于RabbitMQ服务端代码是使用并发式语言erlang编写的,下载地址:http://www.erlang.org/downloads,双击.exe文件进行安装就好,安装完成之后创建一个名为ERLANG_HOME的环境变量,其值指向erlang的安装目录,同时将%ERLANG_HOME%\bin加入到Path中,最后打开命令行,输入erl,如果出现erlang的版本信息就表示erlang语言环境安装

如何在richtextbox中实现类似word中的每行的数字编号功能,求大神指导下给个示例

问题描述 如何在richtextbox中实现类似word中的每行的数字编号功能,求大神指导下给个示例 项目编号我会做的,但是数字编号无从下手了就像这样 1...... 2...... 3...... 4...... 5 . . . 解决方案 数字编号在rtf中没有对应的表示方式. 你必须自己去编号,你可以定义一个特殊符号,作为编号的起始结束位置,然后对这些段落中的行,首字符开始插入编号数字.