RabbitMQ是什么及如何安装就不再赘述,百度一下就知道了,只是在配置方面要多加注意。

话不多说,先直接上一个简示例代码

发送端:

            ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" };
using (IConnection conn = factory.CreateConnection())
{
using (IModel im = conn.CreateModel())
{
im.ExchangeDeclare("rabbitmq_route", ExchangeType.Direct);
im.QueueDeclare("rabbitmq_query", false, false, false, null);
im.QueueBind("rabbitmq_query", "rabbitmq_route", ExchangeType.Direct, null);
for (int i = ; i < ; i++)
{
byte[] message = Encoding.UTF8.GetBytes("Hello Lv");
im.BasicPublish("rabbitmq_route", ExchangeType.Direct, null, message);
Console.WriteLine("send:" + i);
}
}
}

接收端:

            ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "hostserver" };
using (IConnection conn = factory.CreateConnection())
{
using (IModel im = conn.CreateModel())
{
while (true)
{
BasicGetResult res = im.BasicGet("rabbitmq_query", true);
if (res != null)
{
Console.WriteLine("receiver:"+UTF8Encoding.UTF8.GetString(res.Body));
}
}
}
}

发送端一次性发送一千条,发送过程很快,接收时相对要慢一些。

上述DEMO只限一个接收着,那相同的发送量,多个接收者会出现什么情况,添加一个新的接收端,直接复制DEMO中接收端即可。

附上运行结果:

可以看到,在两个接收端同时运行时,RabbitMQ 会按顺序的分发每个消息。当每个收到确认后,会将该消息删除,然后将下一个分发到下一个接收者,主要是因为RabbitMQ的循环分发机制。

上面简单说了一下,在多个接收者时,因为循环分发的原因,消息几乎是两个接收端对分的。

那么如何将相同的消息分发到多个接收端。

对发送端代码进行修改:

            ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" };
using (IConnection conn = factory.CreateConnection())
{
using (IModel im = conn.CreateModel())
{
im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout);// 路由
int i = 0;
while (true)
{
Thread.Sleep(1000);
++i;
byte[] message = Encoding.UTF8.GetBytes(i.ToString());
im.BasicPublish("rabbitmq_route_Fanout", "", null, message);
Console.WriteLine("send:" + i.ToString());
}
}
}

与上种方式比较,会发现在代码注释后面少两段代码,在设置了Fanout方式后,不需要再指定队列名称。停一秒是为了方便看结果,以免刷新太快。

再来看看接收端代码:

            ConnectionFactory factory = new ConnectionFactory { HostName = "hostname", UserName = "root", Password = "root001", VirtualHost = "host" };
using (IConnection conn = factory.CreateConnection())
{
using (IModel im = conn.CreateModel())
{
im.ExchangeDeclare("rabbitmq_route_Fanout", ExchangeType.Fanout);
var queueOk = im.QueueDeclare();//1
im.QueueBind(queueOk.QueueName, "rabbitmq_route_Fanout", "");//2
var consumer = new QueueingBasicConsumer(im);//3
im.BasicConsume(queueOk.QueueName, true, consumer);//4
while (true)
{var _result = (BasicDeliverEventArgs)consumer.Queue.Dequeue();//5
var body = _result.Body;
var message = Encoding.UTF8.GetString(body);
Console.WriteLine("received:{0}", message);
}
}

当一个新的接收端连接时(消费者),需要一个申报一个新的队列,注释1处代码,RabbitMQ在申报队列时,如果不指定名称会自动生成一个,这还是不错的。

两个接收端时运行结果,符合预期。

至于广播方式有什么不好之处,亲自运行下就知道了.

RabbitMQ 在 C# 中简单应用的更多相关文章

  1. RabbitMQ系列(二)深入了解RabbitMQ工作原理及简单使用

    深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍 ...

  2. 深入解读RabbitMQ工作原理及简单使用

    RabbitMQ系列目录 RabbitMQ在Ubuntu上的环境搭建 深入解读RabbitMQ工作原理及简单使用 Rabbit的几种工作模式介绍与实践 Rabbit事务与消息确认 Rabbit集群搭建 ...

  3. RabbitMQ六种队列模式-简单队列模式

    前言 RabbitMQ六种队列模式-简单队列 [本文]RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...

  4. 深入了解RabbitMQ工作原理及简单使用

    深入了解RabbitMQ工作原理及简单使用 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchange介绍 ...

  5. .NetCore中简单使用EasyNetQ

    前言 我们在.Net中使用RabbitMQ,最原始的就是基于RabbitMQ.Client进行编码,在这个过程中我们需要通过代码约定和维护队列,Exchange等.如果是自行编码封装通用型的Rabbi ...

  6. 在浏览器中简单输入一个网址,解密其后发生的一切(http请求的详细过程)

    在浏览器中简单输入一个网址,解密其后发生的一切(http请求的详细过程) 原文链接:http://www.360doc.com/content/14/1117/10/16948208_42571794 ...

  7. win32程序中简单应用mfc

    今日写程序在win32中用CRect发现报错,突然想起来.要引入mfc库.想重新建立一个工程添加对mfc的支持.发现选项不能选.查资料后发现. 在win32程序中简单应用mfc库,只需要简单的引入&l ...

  8. PHP中简单的图形处理

    PHP中简单的图形处理 计应134凌豪 1.加载GD库 GD库是一个开放的动态创建图像.源代码公开的函数库,可以从官方网站http://www.boutell.com/gd处下载.目前,GD库支持GI ...

  9. struts中简单的校验

    Struts中简单的校验 “计应134(实验班) 凌豪” Struts2校验简要说明:struts2中通常情况下,类型转换要在数据校验之前进行.类型转换其实也是基本的服务器端校验,合法数据必然可以通过 ...

随机推荐

  1. 南阳OJ 1170 最大的数

    最大的数 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个数 在这n个数 ...

  2. java随机数组

    import java.util.Random; public class Ccore { public static void main(String[] args) { for(int i=1;i ...

  3. 杂项:UN-APP

    ylbtech-杂项:APP 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   7.返回顶部   8.返回顶部   9.返回顶部   10 ...

  4. Window中的内存地址(小知识)

    现在的编辑器大部分工作都是内存管理托管型,所以很少直接对Window的内存地址直接管理了. Window中的内存地址主要是以16进制数字体现的,当操作系统为32位时,那么每个内存地址为2的32次方,也 ...

  5. ubuntu16.04 双网卡绑定

    ubuntu 16.04 双网卡绑定仅仅需要配置/etc/network/interfaces 添加标记内容即可 apt-get install ifenslave 默认已经安装

  6. EasyUI应用总结

    1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncod ...

  7. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial—5.4 绘制数据图

    5.4 绘制数据图 参考视频: 5 - 4 - Plotting Data (10 min) 5.4.1 绘制曲线 1.画一个sin曲线 >> t = [:0.01:0.98]; > ...

  8. 关于微信公众号内嵌网页的几个meta标签

    最近在做微信公众平台内嵌app,其实也就是web app="=,不过就是基于微信内置浏览器(safari加了一个WeixinJS对象),稍微记一下几个html的meta标签(web app通 ...

  9. JAVA基础知识总结17(网络编程)

    端口: 物理端口:IP地址 逻辑端口:用于标识进程的逻辑地址,不同进程的标识:有效端口:0~65535,其中0~1024系统使用或保留端口. JAVA中ip对象:InetAddress. import ...

  10. 求正整数n的所有因子

    因子的概念:假如整数n除以m,结果是无余数的整数,那么我们称m就是n的因子. 需要注意的是,唯有被除数,除数,商皆为整数,余数为零时,此关系才成立.反过来说,我们称n为m的倍数. 求一个正整数n的所有 ...