欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

RabbitMQ .NET消息队列使用详解

程序员文章站 2023-11-22 10:31:34
本文实例为大家分享了rabbitmq .net消息队列使用方法,供大家参考,具体内容如下 首先下载安装包,我都环境是win7 64位: 去官网下载 otp_win64_...

本文实例为大家分享了rabbitmq .net消息队列使用方法,供大家参考,具体内容如下

首先下载安装包,我都环境是win7 64位:
去官网下载 otp_win64_19.0.exe  和rabbitmq-server-3.6.3.exe安装好
然后开始编程了:
(1)创建生产者类:

class program 
 { 
   private static void main() 
   { 
     //建立rabbitmq连接和通道 
     var connectionfactory = new connectionfactory 
     { 
       hostname = "127.0.0.1", 
       port = 5672, 
       username = "guest", 
       password = "guest", 
       protocol = protocols.defaultprotocol, 
       automaticrecoveryenabled = true, //自动重连 
       requestedframemax = uint32.maxvalue, 
       requestedheartbeat = uint16.maxvalue //心跳超时时间 
     }; 
     try 
     { 
       using (var connection = connectionfactory.createconnection()) 
       { 
         using (var channel = connection.createmodel()) 
         { 
           //创建一个新的,持久的交换区 
           channel.exchangedeclare("sisoexchange", exchangetype.direct, true, false, null); 
           //创建一个新的,持久的队列, 没有排他性,与不自动删除 
           channel.queuedeclare("sisoqueue", true, false, false, null); 
           // 绑定队列到交换区 
           channel.queuebind("sisoqueue", "sisoexchange", "optionalroutingkey"); 
 
           // 设置消息属性 
           var properties = channel.createbasicproperties(); 
           properties.deliverymode = 2; //消息是持久的,存在并不会受服务器重启影响  
 
           //准备开始推送 
           //发布的消息可以是任何一个(可以被序列化的)字节数组,如序列化对象,一个实体的id,或只是一个字符串 
           var encoding = new utf8encoding(); 
           for (var i = 0; i < 10; i++) 
           { 
             var msg = string.format("这是消息 #{0}?", i + 1); 
             var msgbytes = encoding.getbytes(msg); 
             //rabbitmq消息模型的核心思想就是,生产者不把消息直接发送给队列。实际上,生产者在很多情况下都不知道消息是否会被发送到一个队列中。取而代之的是,生产者将消息发送到交换区。交换区是一个非常简单的东西,它一端接受生产者的消息,另一端将他们推送到队列中。交换区必须要明确的指导如何处理它接受到的消息。是放到一个队列中,还是放到多个队列中,亦或是被丢弃。这些规则可以通过交换区的类型来定义。 
             //可用的交换区类型有:direct,topic,headers,fanout。 
             //exchange:用于接收消息生产者发送的消息,有三种类型的exchange:direct, fanout,topic,不同类型实现了不同的路由算法; 
             //routingkey:是rabbitmq实现路由分发到各个队列的规则,并结合binging提供于exchange使用将消息推送入队列; 
             //queue:是消息队列,可以根据需要定义多个队列,设置队列的属性,比如:消息移除、消息缓存、回调机制等设置,实现与consumer通信; 
             channel.basicpublish("sisoexchange", "optionalroutingkey", properties, msgbytes); 
           } 
           channel.close(); 
         } 
       } 
     } 
     catch (exception ex) 
     { 
       console.writeline(ex.message); 
     } 
 
     console.writeline("消息发布!"); 
     console.readkey(true); 
   } 
 } 

(1)创建消费者类:

class program 
  { 
    private static void main() 
    { 
      // 建立rabbitmq连接和通道 
      var connectionfactory = new connectionfactory 
      { 
        hostname = "127.0.0.1", 
        port = 5672, 
        username = "guest", 
        password = "guest", 
        protocol = protocols.amqp_0_9_1, 
        requestedframemax = uint32.maxvalue, 
        requestedheartbeat = uint16.maxvalue 
      }; 
 
      using (var connection = connectionfactory.createconnection()) 
      using (var channel = connection.createmodel()) 
      { 
        // 这指示通道不预取超过1个消息 
        channel.basicqos(0, 1, false); 
 
        //创建一个新的,持久的交换区 
        channel.exchangedeclare("sisoexchange", exchangetype.direct, true, false, null); 
        //创建一个新的,持久的队列 
        channel.queuedeclare("sample-queue", true, false, false, null); 
        //绑定队列到交换区 
        channel.queuebind("sisoqueue", "sisoexchange", "optionalroutingkey"); 
        using (var subscription = new subscription(channel, "sisoqueue", false)) 
        { 
          console.writeline("等待消息..."); 
          var encoding = new utf8encoding(); 
          while (channel.isopen) 
          { 
            basicdelivereventargs eventargs; 
            var success = subscription.next(2000, out eventargs); 
            if (success == false) continue; 
            var msgbytes = eventargs.body; 
            var message = encoding.getstring(msgbytes); 
            console.writeline(message); 
            channel.basicack(eventargs.deliverytag, false); 
          } 
        } 
      } 
    } 
  } 

消费者--结果如图:

RabbitMQ .NET消息队列使用详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。