RabbitMq 对比MSMQ
环境 win10 64位系统
首先 下载 rabbitMq 服务器安装包RabbitMq3.5.4官方下载.
如果你有早期版本的Erlang环境 ,要先卸载掉,然后再安装最新Erlang 虚拟机
先安装完 Erlang 环境后 再安装刚下载到的 RabbitMq 3.5.4
下载 RabbitMq 的.net 类库 有兴趣也可以下载源码阅读
创建Send 项目 代码如下
- static void Main(string[] args)
- {
- var factory = new ConnectionFactory();
- factory.UserName = "guest";
- factory.Password = "guest";
- factory.VirtualHost = "/";
- factory.HostName = "127.0.0.1";
- var conn = factory.CreateConnection();
- var channel = conn.CreateModel();
- channel.ExchangeDeclare("exchange", ExchangeType.Direct);
- channel.QueueDeclare("myRabbit", false, false, false, null);
- channel.QueueBind("myRabbit", "exchange", "123", null);
- byte[] messageBodyBytes = Encoding.UTF8.GetBytes("Hello World!!");
- channel.BasicPublish("exchange", "123", null, messageBodyBytes);
- }
- var factory = new ConnectionFactory();
- //用户名
- factory.UserName = "guest";
- //密码
- factory.Password = "guest";
- //此连接访问的虚拟主机
- factory.VirtualHost = "/";
- //主机名
- factory.HostName = "127.0.0.1";
- //创建连接
- using (IConnection conn = factory.CreateConnection())
- {<pre name="code" class="csharp"> //创建通道
- private static void Main(string[] args)
- {
- var factory = new ConnectionFactory();
- //用户名
- factory.UserName = "guest";
- //密码
- factory.Password = "guest";
- //此连接访问的虚拟主机
- factory.VirtualHost = "/";
- //主机名
- factory.HostName = "127.0.0.1";
- //创建连接
- //创建通道
- using (IConnection conn = factory.CreateConnection())
- {
- 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);
- //}
- //订阅模式 (有消息到达将被自动接收) 消费者
- var consumer = new EventingBasicConsumer(channel);
- //注册接收事件
- consumer.Received += (ch, ea) =>
- {
- var body = ea.Body;
- var str = Encoding.UTF8.GetString(body);
- Console.WriteLine(str);
- //((EventingBasicConsumer)ch).Model.BasicAck(ea.DeliveryTag, false);
- };
- //要释放的资源
- String consumerTag = channel.BasicConsume("myRabbit", false, consumer);
- //当不希望继续订阅时,取消订阅(消费者)
- //channel.BasicCancel(consumerTag);
- Console.ReadKey();
- }
- }
- }
安装和 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),将交换器和队列连接起来,并且封装消息的路由信息