RabbitMq 安装和 Hello World--.Net

RabbitMq 对比MSMQ 

环境 win10 64位系统 

首先 下载 rabbitMq 服务器安装包RabbitMq3.5.4官方下载.

如果你有早期版本的Erlang环境 ,要先卸载掉,然后再安装最新Erlang 虚拟机

先安装完 Erlang 环境后 再安装刚下载到的 RabbitMq 3.5.4

下载 RabbitMq 的.net 类库 有兴趣也可以下载源码阅读


创建Send 项目 代码如下

[csharp]  view plain copy print ?
  1. static void Main(string[] args)  
  2.        {  
  3.            var factory = new ConnectionFactory();  
  4.            factory.UserName = "guest";  
  5.            factory.Password = "guest";  
  6.            factory.VirtualHost = "/";  
  7.            factory.HostName = "127.0.0.1";  
  8.   
  9.            var conn = factory.CreateConnection();  
  10.            var channel = conn.CreateModel();  
  11.            channel.ExchangeDeclare("exchange", ExchangeType.Direct);  
  12.            channel.QueueDeclare("myRabbit"falsefalsefalsenull);  
  13.            channel.QueueBind("myRabbit""exchange""123"null);  
  14.              
  15.   
  16.            byte[] messageBodyBytes = Encoding.UTF8.GetBytes("Hello World!!");  
  17.            channel.BasicPublish("exchange""123"null, messageBodyBytes);  
  18.        }  



创建接收项目,代码如下
[csharp]  view plain copy print ?
  1. var factory = new ConnectionFactory();  
  2.            //用户名  
  3.            factory.UserName = "guest";  
  4.            //密码  
  5.            factory.Password = "guest";  
  6.            //此连接访问的虚拟主机  
  7.            factory.VirtualHost = "/";  
  8.            //主机名  
  9.            factory.HostName = "127.0.0.1";  
  10.            //创建连接  
  11.            using (IConnection conn = factory.CreateConnection())  
  12.            {<pre name="code" class="csharp">               //创建通道  
using (IModel channel = conn.CreateModel()) { //普通接收消息(主动请求) bool noAck = false; BasicGetResult result = channel.BasicGet("myRabbit", noAck); if (result == null) { // No message available at this time. Console.WriteLine("没有"); } else { IBasicProperties props = result.BasicProperties; byte[] body = result.Body; var str = Encoding.UTF8.GetString(body); Console.WriteLine(str); channel.BasicAck(result.DeliveryTag, false); } } } Console.ReadKey(); }
 
接收方 可以使用简单的 主动读取消息来处理.  也可以使用订阅的方式来自动获取到消息,代码如下 

[csharp]  view plain copy print ?
  1. private static void Main(string[] args)  
  2.       {  
  3.           var factory = new ConnectionFactory();  
  4.           //用户名  
  5.           factory.UserName = "guest";  
  6.           //密码  
  7.           factory.Password = "guest";  
  8.           //此连接访问的虚拟主机  
  9.           factory.VirtualHost = "/";  
  10.           //主机名  
  11.           factory.HostName = "127.0.0.1";  
  12.           //创建连接  
  13.   
  14.           //创建通道  
  15.           using (IConnection conn = factory.CreateConnection())  
  16.           {  
  17.               using (IModel channel = conn.CreateModel())  
  18.               {  
  19.                   //普通接收消息(主动请求)  
  20.                   //bool noAck = false;  
  21.                   //BasicGetResult result = channel.BasicGet("myRabbit", noAck);  
  22.                   //if (result == null)  
  23.                   //{  
  24.                   //    // No message available at this time.  
  25.                   //    Console.WriteLine("没有");  
  26.                   //}  
  27.                   //else  
  28.                   //{  
  29.                   //    IBasicProperties props = result.BasicProperties;  
  30.                   //    byte[] body = result.Body;  
  31.                   //    var str = Encoding.UTF8.GetString(body);  
  32.                   //    Console.WriteLine(str);  
  33.   
  34.                   //    channel.BasicAck(result.DeliveryTag, false);  
  35.                   //}  
  36.                   //订阅模式 (有消息到达将被自动接收) 消费者  
  37.                   var consumer = new EventingBasicConsumer(channel);  
  38.                   //注册接收事件  
  39.                   consumer.Received += (ch, ea) =>  
  40.                   {  
  41.                       var body = ea.Body;  
  42.                       var str = Encoding.UTF8.GetString(body);  
  43.                       Console.WriteLine(str);  
  44.                       //((EventingBasicConsumer)ch).Model.BasicAck(ea.DeliveryTag, false);  
  45.                   };  
  46.                   //要释放的资源  
  47.                   String consumerTag = channel.BasicConsume("myRabbit"false, consumer);  
  48.                   //当不希望继续订阅时,取消订阅(消费者)  
  49.                   //channel.BasicCancel(consumerTag);  
  50.   
  51.                   Console.ReadKey();  
  52.               }  
  53.           }  
  54.   
  55.       }  

安装和 Hello world 搞定


连接(Connection),与RabbitMQ Server建立的一个连接,由ConnectionFactory创建,每个connection只与一个物理的Server进行连接,此连接是基于Socket进行连接的,AMQP一般使用TCP链接来保证消息传输的可靠性


通道 (Channel),在C#客户端里应该是叫Model,其他客户端基本都叫Channel。建立在Connection基础上的一个通道,相对于Connection来说,它是轻量级的。它就像是Hibernate里面的Session一样。Channel 主要进行相关定义,发送消息,获取消息,事务处理等。Channel可以在多线程中使用,但是在必须保证任何时候只有一个线程执行命令。一个Connection可以有多个Channel。客户端程序有时候会是一个多线程程序,每一个线程都想要和RabbitMQ进行连接,但是又不想共享一个连接,这种需求还是比较普遍的。因为一个Connection就是一个TCP链接,RabbitMQ在设计的时候不希望与每一个客户端保持多个TCP连接,但这确实是有些客户端的需求,所以在设计中引入了Channel的概念,每一个Channel之间没有任何联系,是完全分离的。多个Channel来共享一个Connection。


交换器(Exchange),是发送消息的实体


队列(Queue),这是接收消息的实体


绑定器(Bind),将交换器和队列连接起来,并且封装消息的路由信息

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值