.NET 使用 RabbitMQ 图文简介
前言
最近项目要使用RabbitMQ,园里里面已经有很多优秀的文章,Rabbitmq官网也有.net实例。这里我尝试下图文并茂之形式记录下使用的过程。
安装
RabbitMQ是建立在erlang OTP平台下,因此在windows下需要下载并安装以下两个组件:
2. Rabbit MQ Windows Service Install
RabbitMQ安装完成之后一般需要设置一个账号,通过命令 add_user , set_permissions 设置权限,set_user_tags 设置群组。
还需要安装其基于http的管理平台插件,这个平台插件便于我们查看和管理RabbitMQ,可以通过命令行将其启用。
rabbitmq-plugins enable rabbitmq_management
rabbitmqctl add_user july July!
rabbitmqctl set_permissions july ".*" ".*" ".*"
rabbitmqctl set_user_tags july administrator
之后就可以通过 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 (一) 简介和基本概念
原文:https://blog.csdn.net/vbirdbest/article/details/78577043 一.简介 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序 ...
- rabbitmq架构简介(包括集群)
总的来说,rabbitmq使用erlang语言编写,其架构类似于servlet容器运行servlet应用,底层是erlang VM.然后是erlang节点,上面是应用.如下所示: 每个MQ中运行的应用 ...
- chrome添加 postman扩展程序图文简介
Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件.无论是web前端开发 或 android.ios开发,只要涉及调用后端接口,postman这类型工具就必不可少了.相对于 ...
- RabbitMQ学习(一):RabbitMQ要点简介
转载:http://blog.csdn.net/leixiaotao_java/article/details/78909760#t0 1.什么是RabbitMQ? RabbitMQ是由Erlang语 ...
- rabbitmq概念简介
AMQP协议 AMQP: Advanced Message Queue,高级队列协议. 特征: 这是一个在进程间传递异步消息的网络协议,因此数据的发送方.接收方以及容器(MQ)都可以在不同的设备上. ...
- tcp头和ip头 图文简介和简要说明
https://blog.csdn.net/soullsj/article/details/80304124
- Net分布式系统之四:RabbitMQ消息队列应用
消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是通过消息队列传输系统日志.目前 ...
- 缓存大全(Memcached、redis、RabbitMQ )
Memcached: 简介.安装.使用 python操作Memcached Memcached天生支持集群 Redis: 简介.安装.使用.实例 Python操作Redis String.Hash.L ...
- RabbitMQ消息队列应用
RabbitMQ消息队列应用 消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是 ...
随机推荐
- DAG 模型 stacking boxes 动态规划
题目:UVA 103 stacking boxes 题目大意: 给你两个数,一个是盒子的个数,一个是每一个盒子的维数.将一个个盒子互相装起来,让你求最多可以装多少个,要求字典序最小. 解析:这个就是盒 ...
- spring.factories
在Spring Boot中有一种非常解耦的扩展机制:Spring Factories.这种扩展机制实际上是仿照Java中的SPI扩展机制来实现的. Java SPI机制SPI的全名为Service P ...
- UVA506-System Dependencies(拓扑序)
Problem UVA506-System Dependencies Accept:285 Submit:2824 Time Limit: 3000 mSec Problem Description ...
- ceph 问题处理
1.三个ceph monitor节点clock skew时钟偏移问题?解决:(1)其他控制节点更改ntp.conf与controller01进行同步,如果ntpd不生效,使用date -s " ...
- day14 Python函数之可变长参数
函数参数 1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元.因此,形参只在函数内部有效.函数调用结束返回主调用函数后则不能再使用该形参变量 2.实参可以是常量.变量.表 ...
- JavaScript高级程序设计学习(四)之引用类型
在javascript中也是有引用类型的,java同样如此. javascript常见也比较常用的引用类型就熟Object和Array. 一个对象和一个数组,这个在前后端分离开发中也用的最多.比如aj ...
- 笔记二:常用的h5语义化标签
0.前言: 所谓语义化标签就是一种 我们仅通过标签名就能判断出该标签内容的语义的标签,见名知意. 总结这部分内容,主要是为了能从繁琐的div嵌套div中,改成带有h5标签码.这样更有利于读写代码. 人 ...
- AI 数值计算
数值计算,通过迭代来更新解的估计值. 1.上溢和下溢 实数按照一定的精度存储在计算机中,通常存在误差,进而可能导致一些错误. 1)下溢(underflow),例如接近0的数 2)上溢(overflow ...
- #ifdef __cplusplus extern "C" { #endif”的定义
平时我们在linux c平台开发的时候,引用了一些Cpp或者C的代码库,发现一些头文件有如下代码条件编译. #ifdef __cplusplus extern "C" { #e ...
- P4111 [HEOI2015]小Z的房间
你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着.你想要打通一些相邻房间的墙,使得所有房间能够互相到达.在此过程中,你不能把 ...