RabbitMQ---3、c#实现
1、EasyNetQ组件的使用
EasyNetQ组件的使用方式比较简单,跟很多组件都类似,例如:建立连接,进行操作做等等,对于EasyNetQ组件也是如此。(mq的升级,用于简化rabbitmq应用代码)
在.NET中使用EasyNetQ,要求至少基于 .NET4.5的框架基础上进行开发,可以直接在VS项目上使用NuGet的程序包进行添加EasyNetQ的引用。


一般添加引用后,至少包含了下面图示的几个引用DLL。

2、相关概念
ConnectionFactory(连接工厂): 生产Connection的的工厂
Connection(连接):是RabbitMQ的socket的长链接,它封装了socket协议相关部分逻辑
Channel(频道|信道): 是建立在Connection连接之上的一种轻量级的连接,我们大部分的业务操作是在Channel这个接口中完成的,包括定义队列的声明queueDeclare、交换机的声明exchangeDeclare、队列的绑定queueBind、发布消息basicPublish、消费消息basicConsume等。如果把Connection比作一条光纤电缆的话,那么Channel信道就比作成光纤电缆中的其中一束光纤。一个Connection上可以创建任意数量的Channel。
Producer(生产者):生产者用于发布消息
Exchange(交换机):生产者会将消息发送到交换机,然后交换机通过路由策略(规则)将消息路由到匹配的队列中去
Routing Key(路由键):一个String值,用于定义路由规则,在队列绑定的时候需要指定路由键,在生产者发布消息的时候需要指定路由键,当消息的路由键和队列绑定的路由键匹配时,消息就会发送到该队列。
Queue(队列):用于存储消息的容器,可以看成一个有序的数组,生产者生产的消息会发送到交换机中,最终交换机将消息存储到某个或某些队列中,队列可被消费者订阅,消费者从订阅的队列中获取消息。
Binding(绑定): Binding并不是一个概念,而是一种操作,RabbitMQ中通过绑定,以路由键作为桥梁将Exchange与Queue关联起来(Exchange—>Routing Key—>Queue),这样RabbitMQ就知道如何正确地将消息路由到指定的队列了,通过queueBind方法将Exchange、Routing Key、Queue绑定起来
Consumer(消费者):用于从队列中获取消息,消费者只需关注队列即可,不需要关注交换机和路由键,消费者可以通过basicConsume(订阅模式可以从队列中一直持续的自动的接收消息)或者basicGet(先订阅消息,然后获取单条消息,再然后取消订阅,也就是说basicGet一次只能获取一条消息,如果还想再获取下一条还要再次调用basicGet)来从队列中获取消息
vhost(虚拟主机): RabbitMQ 通过虚拟主机(virtual host)来分发消息, 拥有自己独立的权限控制,不同的vhost之间是隔离的,单独的。vhost是权限控制的基本单位,用户只能访问与之绑定的vhost,默认vhost:”/” ,默认用户”guest” 密码“guest”,来访问默认的vhost。
下图说明了生产者将消息发送到交换机中,然后又路由到指定的队列中
3、分发与订阅使用

1)发送消息代码:
- /// <summary>
- /// 连接配置
- /// </summary>
- private static readonly ConnectionFactory rabbitMqFactory = new ConnectionFactory(){
- HostName ="192.168.1.8",UserName="hao",Password="abc123",Port= 5672
- };
- /// <summary>
- /// 路由名称
- /// </summary>
- const string TopExchangeName = "topic.justin.exchange";
- //队列名称
- const string TopQueueName = "topic.justin.queue";
- public static void TopicExchangeSendMsg()
- {
- using (IConnection conn = rabbitMqFactory.CreateConnection())
- {
- using (IModel channel = conn.CreateModel())
- {
- channel.ExchangeDeclare(TopExchangeName, "topic", durable: false, autoDelete: false, arguments: null);
- channel.QueueDeclare(TopQueueName, durable: false, autoDelete: false, exclusive: false, arguments: null);
- channel.QueueBind(TopQueueName, TopExchangeName, routingKey: TopQueueName);
- //var props = channel.CreateBasicProperties();
- //props.Persistent = true;
- string vadata = Console.ReadLine();
- while (vadata != "exit")
- {
- var msgBody = Encoding.UTF8.GetBytes(vadata);
- channel.BasicPublish(exchange: TopExchangeName, routingKey: TopQueueName, basicProperties: null, body: msgBody);
- Console.WriteLine(string.Format("***发送时间:{0},发送完成,输入exit退出消息发送", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
- vadata = Console.ReadLine();
- }
- }
- }
- }
2)测试验证(登入rabbitmq服务器)


Customer
1)接收消息代码:
- /// <summary>
- /// 连接配置
- /// </summary>
- private static readonly ConnectionFactory rabbitMqFactory = new ConnectionFactory() {
- HostName = "192.168.1.8", UserName = "hao", Password = "abc123", Port = 5672
- };
- /// <summary>
- /// 路由名称
- /// </summary>
- const string TopExchangeName = "topic.justin.exchange";
- //队列名称
- const string TopQueueName = "topic.justin.queue";
- public static void TopicAcceptExchange()
- {
- using (IConnection conn = rabbitMqFactory.CreateConnection())
- {
- using (IModel channel = conn.CreateModel())
- {
- channel.ExchangeDeclare(TopExchangeName, "topic", durable: false, autoDelete: false, arguments: null);
- channel.QueueDeclare(TopQueueName, durable: false, autoDelete: false, exclusive: false, arguments: null);
- channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);
- channel.QueueBind(TopQueueName, TopExchangeName, routingKey: TopQueueName);
- var consumer = new EventingBasicConsumer(channel);
- consumer.Received += (model, ea) =>
- {
- var msgBody = Encoding.UTF8.GetString(ea.Body);
- Console.WriteLine(string.Format("***接收时间:{0},消息内容:{1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), msgBody));
- int dots = msgBody.Split('.').Length - 1;
- System.Threading.Thread.Sleep(dots * 1000);
- Console.WriteLine(" [x] Done");
- channel.BasicAck(deliveryTag: ea.DeliveryTag, multiple: false);
- };
- channel.BasicConsume(TopQueueName, noAck: false, consumer: consumer);
- Console.WriteLine("按任意值,退出程序");
- Console.ReadKey();
- }
- }
- }
2)查看queue中的messages字段情况

参考资料:https://cloud.tencent.com/developer/article/1151202
.net api应用资料:
http://www.rabbitmq.com/dotnet-api-guide.html#recovery ;
https://tw.wxwenku.com/d/101521853 ;
https://blog.csdn.net/WuLex/article/details/62043912;https://www.codeproject.com/Articles/309786/Rabbit-Mq-Shovel-Example ;
RabbitMQ---3、c#实现的更多相关文章
- 消息队列——RabbitMQ学习笔记
消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...
- RabbitMq应用二
在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...
- 如何优雅的使用RabbitMQ
RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具.消息队列的使用场景大概有3种: 1.系统集成,分布式系统的设 ...
- RabbitMq应用一的补充(RabbitMQ的应用场景)
直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...
- RabbitMq应用一
RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...
- 缓存、队列(Memcached、redis、RabbitMQ)
本章内容: Memcached 简介.安装.使用 Python 操作 Memcached 天生支持集群 redis 简介.安装.使用.实例 Python 操作 Redis String.Hash.Li ...
- 消息队列性能对比——ActiveMQ、RabbitMQ与ZeroMQ(译文)
Dissecting Message Queues 概述: 我花了一些时间解剖各种库执行分布式消息.在这个分析中,我看了几个不同的方面,包括API特性,易于部署和维护,以及性能质量..消息队列已经被分 ...
- windows下 安装 rabbitMQ 及操作常用命令
rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rab ...
- RabbitMQ + PHP (三)案例演示
今天用一个简单的案例来实现 RabbitMQ + PHP 这个消息队列的运行机制. 主要分为两个部分: 第一:发送者(publisher) 第二:消费者(consumer) (一)生产者 (创建一个r ...
- RabbitMQ + PHP (二)AMQP拓展安装
上篇说到了 RabbitMQ 的安装. 这次要在讲案例之前,需要安装PHP的AMQP扩展.不然可能会报以下两个错误. 1.Fatal error: Class 'AMQPConnection' not ...
随机推荐
- Delphi开发安卓程序的感受
Delphi XE7开发安卓程序,界面开发速度非常快,这是eclipse无法比的,还有就是界面自适应能力很棒,我在不同版本和尺寸的设备中测试,运行良好,这些设备包括:三星I9100(安卓2.3:不到5 ...
- pyppeteer初尝滋味
最近在爬几个电商平台网站用的selenium一登录就会有验证,目前这些网站对selenium检测很严格 因为不少大网站有对selenium的js监测机制.比如navigator.webdriver,n ...
- soapui加载天气预报接口报错Characters larger than 4 bytes are not supported: byte 0xb1 implies a length of more than 4 byte的解决办法
soapui加载天气预报接口时报错如下: Error loading [http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl ...
- node-redis模块需要注意的事项
node之中连接redis使用的redis模块,虽然好用,但是有些地方还是需要注意. npm install redis redis client 行为:1.客户端执行过程中断网的情况 由于原本连接正 ...
- MDX常用几种查询对比
MDX1: SELECT NON EMPTY {Hierarchize( { [Measures].[年初数 的总和], [Measures].[期末数 的总和], [Measures].[本期发生数 ...
- UI1
计算机工程系 目 录 实验一 Photoshop基本界面熟悉 3 实验二 PhotoShop常用工具的使用 4 实验三 图象和图层的处理 7 实验四 各种滤镜方式的处理 13 实验五 Ph ...
- 华南理工大学“三七互娱杯”程序设计竞赛 HRY and codefire(概率期望DP)
https://ac.nowcoder.com/acm/contest/874/A 题目:有两个账号 , 一开始都为0级 , 求任意一个账号升级到N的期望 要求:如果当前账号嬴了 , 就继续沿用当前的 ...
- OpenERP 中的on_change方法总结
1.xml中应为on_change=""的形式 2.py文件中 self,cr,uid,ids为必备参数,后面的参数根据xml文件中的参数的数量而定 3.return的是一个字典, ...
- Mac下使用Wine安装Xshell 4和Xftp 4
下载: (链接: https://pan.baidu.com/s/1o78qisM 密码: 79sq) 安装: 1.安装Wine 参考:http://www.cnblogs.com/EasonJim/ ...
- FindLine把多行查找改为多行替换
Sub FindLine() Dim textSelection As TextSelection textSelection = DTE.ActiveDocument.Selection textS ...