NET 使用 RabbitMQ
NET 使用 RabbitMQ
前言
最近项目要使用RabbitMQ,园里里面已经有很多优秀的文章,Rabbitmq官网也有.net实例。这里我尝试下图文并茂之形式记录下使用的过程。
安装
RabbitMQ是建立在erlang OTP平台下,因此在windows下需要下载并安装以下两个组件:
2. Rabbit MQ Windows Service Install
RabbitMQ一般还需要安装其基于http的管理平台插件,这个平台插件便于我们查看和管理RabbitMQ,可以通过命令行将其启用:
rabbitmq-plugins enable rabbitmq_management |
之后就可以通过 http://localhost:15672/ 登录,账号的密码和密码可以使用默认的guest/guest,登录之后的页面:
RabbitMq 使用
下图就是具体的使用流程
其方框中就是Rabbitmq的message broker,我们将上图按上下方式来解释:
1. 信息发送端将消息(message)发送到exchange
2. exchange接受消息之后,负责将其路由到具体的队列中
3. Bindings负责连接exchange和队列(queue)
4. 消息到达队列(queue),然后等待被消息接收端处理
5. 消息接收端处理消息
初始化RabbitMQ
现在我们用代码来demo流程,首先在nuget上获取RabbitMQ.Client:
然后创建图中2,3,4步需要的exchange,bingding,queue

string exchangeName = "test.exchange";
string queueName = "test1.queue";
string otherQueueName = "test2.queue";
using (IConnection conn = rabbitMqFactory.CreateConnection())
using (IModel channel = conn.CreateModel())
{
//2 定义一个exchange
channel.ExchangeDeclare(exchangeName, "direct", durable: true, autoDelete: false, arguments: null); //4 定义两个queue
channel.QueueDeclare(queueName, durable: true, exclusive: false, autoDelete: false, arguments: null);
channel.QueueDeclare(otherQueueName, durable: true, exclusive: false, autoDelete: false, arguments: null); //3 定义exchange到queue的binding
channel.QueueBind(queueName, exchangeName, routingKey: queueName);
channel.QueueBind(otherQueueName, exchangeName, routingKey: otherQueueName);
}

创建成功之后可以在rabbit的管理平台查看:
发送消息
从图上我们得知消息是发送到rabbitmq的exchange,但可以传一些消息属性如routingkey,一下代码中我们将队列的名字作为routingkey传进去:

string exchangeName = "test.exchange";
string queueName = "test1.queue";
string otherQueueName = "test2.queue";
using (IConnection conn = rabbitMqFactory.CreateConnection())
using (IModel channel = conn.CreateModel())
{
var props = channel.CreateBasicProperties();
props.Persistent = true; var msgBody = Encoding.UTF8.GetBytes("Hello, World!"); //1. 发送消息到exchange ,但加上routingkey
channel.BasicPublish(exchangeName, routingKey: queueName, basicProperties: props, body: msgBody);
channel.BasicPublish(exchangeName, routingKey: otherQueueName, basicProperties: props, body: msgBody);
}

发送之后可以在rabbitmq上看到:
接收消息

string queueName = "test1.queue";
string otherQueueName = "test2.queue";
using (IConnection conn = rabbitMqFactory.CreateConnection())
using (IModel channel = conn.CreateModel())
{
//5. 从test1.queue 队列获取消息
BasicGetResult msgResponse = channel.BasicGet(queueName, noAck: true);
string msgBody = Encoding.UTF8.GetString(msgResponse.Body); //5. 从test2.queue 队列获取消息
msgResponse = channel.BasicGet(otherQueueName, noAck: true);
msgBody = Encoding.UTF8.GetString(msgResponse.Body); }

总结
通过以上的简述我们对rabbitmq的使用就有了大概的了解。
NET 使用 RabbitMQ的更多相关文章
- 消息队列——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 ...
随机推荐
- linux局域网搭建yum仓库(本地(file)、网络(ftp、http))
linux局域网搭建yum仓库(本地(file).网络(ftp.http)) yum配置文件解释: [ ]:定义仓库,base为仓库的名字,可任意 name:仓库的简短文字描述 baseurl:仓库的 ...
- python爬虫之小说网站--下载小说(正则表达式)
python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ...
- CentOS 7.0下安装Python3.6
CentOS 7.0自带Python2.7 安装Python3.6步骤 1.安装依赖 yum install -y zlib-devel bzip2-devel openssl-devel ncurs ...
- 如何解决make时报错crti. o: unrecognized relocation (0x2a) in section `.init
这个问题困扰了我好长时间,网上查了好长时间,这个问题的解决方法,就是将binultils升级到2.26. 造成这个问题的原因是gcc和binultils版本不匹配,gcc对应的版本较高,gcc编译后, ...
- Redis学习笔记--Redis数据过期策略详解
本文对Redis的过期机制简单的讲解一下 讲解之前我们先抛出一个问题,我们知道很多时候服务器经常会用到redis作为缓存,有很多数据都是临时缓存一下,可能用过之后很久都不会再用到了(比如暂存sessi ...
- 彻底理解js中的&&和||
阅读代码时对一行代码很困惑 step > max_step && (step = min_step); 查阅资料后发现它等价于 if (step > max_step) { ...
- JS学习实践(1) JavaScript 修改图像灯泡
修改灯泡 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...
- show engines 解释
文章转自https://mariadb.com/kb/en/library/show-engines/#description 1)transaction 是否支持事务 2)XA 事务旨在允许分布式事 ...
- vue是一个渐进式的框架,如何理解“渐进式”
每个框架都不可避免会有自己的一些特点,从而会对使用者有一定的要求,这些要求就是主张,主张有强有弱,它的强势程度会影响在业务开发中的使用方式.使用vue,你可以在原有大系统的上面,把一两个组件改用它实现 ...
- Android 读取后台数据并显示。模拟小区车辆管理系统
帮别人做的演示系统,只具有基本的增删查改功能. 核心是android端和后台通过http传输数据 后台是asp.net,数据库是ms sql 2008 android端 private void ge ...