1.RabbitMQ安装

1.1下载并安装Erlang

https://www.erlang.org/downloads

一直点next就安装好了。我直接使用了默认的安装目录。否则的话,应该需要配置一下环境变量吧。

1.2下载并安装RabbitMQ

https://www.rabbitmq.com/download.html

也是一直点next,同样使用了默认的安装目录。

2.配置RabbitMQ

2.1激活RabbitMQ's Management Plugin

打开命令提示符,按下图输入

这一步用不用管理员权限都行。但是重启RabbitMQ需要有管理员权限。

2.2查看、创建用户,角色授权

查看已有用户及角色

rabbitmqctl.bat list_users

创建新用户

rabbitmqctl.bat add_user userName password

给新用户授权administrator角色

rabbitmqctl.bat set_user_tags userName administrator

删除某个用户

rabbitmqctl.bat delete_user userName

更改密码

rabbitmqctl.bat change_password userName newPassword

2.3登录RabbitMQ

打开http://localhost:15672,进入RabbitMQ管理页面,使用用户名和密码登录系统。

3.RabbitMQ简单操作

3.1消息产生者的控制台应用

新建一个名为EventProducer的控制台项目,添加RabbitMQ.Client包。(我这里用的是VS2019创建的.NET CORE的控制台项目)

添加NuGet包,可以通过菜单栏上的“工具->NuGet包管理器->程序包管理控制台”,然后选择正确的“默认项目”,输入Install-Package RabbitMQ.Client的方式进行安装,也可以通过在右侧的“解决方案资源管理器”上右键该项目的依赖项,选择“管理NuGet程序包”,在打开的页面中,输入“RabbitMQ.Client”,然后选择安装。

EventProducer项目发送事件到RabbitMQ Server上。首先要通过ConnectionFactory使用CreateConnection方法与RabbitMQ Server建立连接。

var factory = new ConnectionFactory()
{
HostName = "localhost",
UserName = "larissa",
Password = "hzbp"
}; using(var connection = factory.CreateConnection())

每个connection只连接一个服务器。该连接是基于socket实现的。RabbitMQ基于AMQP,AMQP使用TCP协议。连接服务器后,使用IConnection的CreateModel()方法创建消息通道(channel)。在这里就把model这个单词理解为channel吧。一个connection中可以包含多条消息通道。

var channel = connection.CreateModel();

消息通道创建好了之后,需要声明交换机(exchange)和队列(queue)。在RabbitMQ中,消息产生者、交换机、队列和消息消费者的关系如下图所示。

消息产生者(P)发布消息到交换机(X)上,交换机指定消息按照给定的规则,路由到给定的队列(Q)上。队列是消息载体,也就是说每条消息都是存放在一个或多个队列中的。然后广播到给定的消息消费者(C)。消息通道声明交换机的命令如下:

IModel.ExchangeDeclare(string exchange, string type, bool durable, bool autoDelete, IDictionary<string, object>arguments)

exchange: 交换机的名称

type:交换机的类型。共有四种类型:direct, fanout, topic。

  • direct,处理路由键(每条消息都有一个路由键,可以是事件名eventName),对消息路径进行全文匹配。
  • fanout,不处理路由键,将消息广播到绑定该交换机的所有队列上。
  • topic,对路由键进行模糊匹配。例如“#”表示一个或多个单词,“*”仅匹配一个单词。
  • headers,匹配AMQP消息的header而不是路由键,这个很少用到。

durable:持久化。如果是true的话,则服务器重启时不会丢失消息。

autoDelete:自动删除。自删除的前提是至少有一个队列或者交换器与该交换器绑定。一般都设置为false。

arguments:我一直没用到过这个参数。所以也没研究。

下面声明了一个交换机:

channel.ExchangeDeclare("RabbitMQ_Demo_Exchange", "direct", durable: true, autoDelete: false, arguments: null);

声明了交换机之后,消息通道还需要声明队列。

IModel.QueueDeclare(string queue, bool durable, bool exclusive, bool autoDelete, IDictionary<string, object>arguments)

与交换机声明相比,多了一个exclusive参数。exclusive为true的时候意味着队列是排他的,连接断开时将自动删除。所以一般我都是用的false。

下面声明了一个队列:

channel.QueueDeclare("UserQueue", durable:true, exclusive:false, autoDelete:false, arguments:null);

发布消息时,需要将该消息的路由键和交换机和队列绑定,通过IModel.QueueBind实现,如下:

IModel.QueueBind(string queue, string exchange, string routingKey, IDictionary<string, object>arguments)

在EventProducer项目中,我们发送一个AddUserEvent到消息队列中。AddUserEvent.cs的代码如下:

public class AddUserEvent
{
public string Name { get; }
public int Age { get; }
public AddUserEvent(string Name, int Age)
{
this.Name = Name;
this.Age = Age;
}
}

AddUserEvent

Program.cs的代码如下:

using System;
using RabbitMQ.Client;
using System.Text;
using Newtonsoft.Json; namespace EventProducer
{
class Program
{
const string ExchangeName = "RabbitMQ_Demo_Exchange";
const string QueueName = "UserQueue";
const string eventName = "AddUserEvent";
static void Main(string[] args)
{
var factory = new ConnectionFactory()
{
HostName = "localhost",
UserName = "larissa",
Password = "xxx"
}; using(var connection = factory.CreateConnection())
using(var channel = connection.CreateModel())
{
channel.ExchangeDeclare(ExchangeName, "direct", durable: true, autoDelete: false, arguments: null);
channel.QueueDeclare(QueueName, durable: true, exclusive:false, autoDelete: false, arguments: null);
channel.QueueBind(QueueName, ExchangeName, eventName, arguments: null); AddUserEvent _event = new AddUserEvent("larissa", 100);
var message = JsonConvert.SerializeObject(_event);
var body = Encoding.UTF8.GetBytes(message); channel.BasicPublish(
exchange: ExchangeName,
routingKey: eventName,
mandatory: true,
basicProperties: null,
body: body
); string _message = string.Format(DateTime.Now + "Sent {0} with message : {1}.", eventName, message);
Console.WriteLine(_message);
Console.Read();
}
}
}
}

Program.cs

运行后,可以在RabbitMQ的管理页面查看到刚才所声明的交换机和队列,以及它们之间的绑定。如下图所示。可见,已经成功了产生并发送了AddUserEvent事件到RabbitMQ的UserQueue队列中。

 3.2消息消费者的控制台应用

新建一个EventConsumer的控制台项目,并添加RabbitMQ.Client包。同样的,在消息消费者端也需要连接RabbitMQ Server、创建消息通道和声明交换机和队列。不然消费者怎么知道该接收哪个队列的消息呢。在本项目中,消费者端接收到一个AddUserEvent事件,并对其进行处理。因此,在消费者端也有一个一样的AddUserEvent.cs。Program.cs的代码如下:(这里用的是异步方法)

using System;
using System.Text;
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Threading.Tasks; namespace EventConsumer
{
class Program
{
const string ExchangeName = "RabbitMQ_Demo_Exchange";
const string QueueName = "UserQueue";
static void Main(string[] args)
{
var factory = new ConnectionFactory()
{
HostName = "localhost",
UserName = "larissa",
Password = "xxx",
DispatchConsumersAsync=true // 注意这里,在异步处理事件的时候,这个一定要设置为true
}; using (var connection = factory.CreateConnection())
using (var channel = connection.CreateModel())
{
channel.ExchangeDeclare(ExchangeName, "direct", durable: true, autoDelete: false, arguments: null);
channel.QueueDeclare(QueueName, durable: true, exclusive: false, autoDelete: false, arguments: null); var consumer = new AsyncEventingBasicConsumer(channel);
consumer.Received += Consumer_Received; channel.BasicConsume(queue: QueueName, autoAck: true, consumer);
Console.Read();
}
} static async Task Consumer_Received(object sender, BasicDeliverEventArgs eventArgs)
{
var eventName = eventArgs.RoutingKey;
var message = Encoding.UTF8.GetString(eventArgs.Body.ToArray());
await ProcessEvent(eventName, message); } static async Task ProcessEvent(string eventName, string message)
{
await Task.Delay(1000);
string _message = string.Format("Receive {0} with {1}", eventName, message);
Console.WriteLine(_message);
}
}
}

Program.cs

其中,在下面这句中,autoAck为true时,意味着消息发送到操作系统的套接字缓冲区时,就表示任务消息已经被消费了。但如果此时套接字缓冲区崩溃,消息在未被消费者应用程序消费的情况下就被队列删除。如果想要保证消息可靠的达到消费者端,将autoAck设置为false,当套接字缓冲区崩溃时,仍能保证消息被重新消费。

channel.BasicConsume(queue: QueueName, autoAck: true, consumer);

运行结果如下图所示,显示已经从声明的队列中接收到AddUserEvent事件了。

主要参考:

https://www.cnblogs.com/ericli-ericli/p/5924608.html

和一些博客园的文章,忘记随手记录了。

RabbitMQ安装以及简单操作应用(针对Windows和C#)的更多相关文章

  1. 【ZooKeeper】ZooKeeper安装及简单操作

    ZooKeeper介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一 ...

  2. storm安装以及简单操作

    storm的安装比较简单,下面以storm的单节点为例说明storm的安装步骤. 1.storm的下载 进入storm的官方网站http://storm.apache.org/,点击download按 ...

  3. MySQL安装和简单操作

    MySQL数据库安装与配置详解 MySQL的安装请参考下面这篇博客,讲述的非常详细,各种截图也很清晰.http://www.cnblogs.com/sshoub/p/4321640.html MySQ ...

  4. rabbitmq安装及简单demo练习

    参考:https://my.oschina.net/loveorange/blog/3026473 安装参考链接: 1. 下载自己需要的rabbitmq_server(http://www.rabbi ...

  5. python学习笔记(mysqldb下载安装及简单操作)

    python支持对mysql的操作 已经安装配置成功python.mysql 之后根据各自电脑配置选择对应系统的MySQL-python 文件是EXE格式.打开下一步即可 下载地址博主分享下: htt ...

  6. mysql安装及简单操作

    sudo grep mysql_root_passwd /root/env.txt (现在很多人开始使用云主机,登录云主机之后可以根据该命令查看阿里云数据库密码) mysql 安装:rpm+retha ...

  7. postgresql数据库安装及简单操作

    自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选. 本文介绍PostgreSQL的安装和基本用法,供初次使用者上手.以下内容基于Debian操作系统,其他操作系 ...

  8. 【RabbitMQ】ubuntu下RabbitMQ安装与简单使用

    参考:https://blog.csdn.net/the_fool_/article/details/80570971 1.安装: https://blog.csdn.net/a295277302/a ...

  9. mongodb的安装与简单操作

    MongoDB中文社区:http://www.mongoing.com     数据库的使用场景 SQL(关系型数据库):MySQL.SQLServer  --->磁盘操作 1.高度事务性的场景 ...

随机推荐

  1. Rust 使用 dotenv 来设置环境变量

    在项目中,我们通常需要设置一些环境变量,用来保存一些凭证或其它数据,这时我们可以使用 dotenv 这个 crate. 首先在项目中添加 dotenv 这个依赖: 例如在下面这个项目中,需要设置数据库 ...

  2. C++中的const和mutable

    1 #include<iostream> 2 using namespace std; 3 //如果在类A的成员函数dis()中想要修改_z,但是不能修改_x,_y怎么办? 4 //如果d ...

  3. C++与lua交互之C++访问lua

    假设lua中: name="gzw" id=17010805 sex=man tab={ num=100, str="hello" } foo_one=func ...

  4. C++Template(类模板二)

    namespace _myspace{ template<typename T, typename U> class TC { public: TC() { cout << & ...

  5. JavaScript如何实现上拉加载,下拉刷新?

    转载地址: 面试官:JavaScript如何实现上拉加载,下拉刷新? 一.前言 下拉刷新和上拉加载这两种交互方式通常出现在移动端中 本质上等同于PC网页中的分页,只是交互形式不同 开源社区也有很多优秀 ...

  6. 搭建BBS博客系统

    目录 一:搭建BBS项目 1.部署数据库 2.启动数据库 3.进入数据库 4.远程连接MySQL数据 5.pycham连接Mysql 二:开始部署BBS 1.上传代码 2.数据库迁移 3.删除文件 4 ...

  7. python 定义函数关键字def 简单介绍

    一  在类中定义的def # python中def 是用来干什么的? # 可以定义函数,就是定义一个功能. class People(): def __init__(self): print(&quo ...

  8. oracle 相关查询和非相关查询,oracle 去除重复数据,以及oracle的分页查询!

    一.oracle中的相关查询?和非相关查询? 二.oracle去除重复数据 1. 2. 3.oracle 实现分页? 利用rownum的唯一性,和子查询,将rownum从伪列变成实际列!

  9. 「JOISC 2016 Day 1」棋盘游戏

    「JOISC 2016 Day 1」棋盘游戏 先判无解:第1,3行有连续的空格或四个角有空格. 然后可以发现有解的情况第1,3行可以在任意时间摆放. 对于某一列,若第2行放有棋子,那么显然可以把棋盘分 ...

  10. ApacheJemeter的简单使用

    前言:最近由于工作需要进行接口测试,故简单复习一下ApacheJemeter的使用 安装包下载地址: 链接:https://pan.baidu.com/s/11ywNWRUkFNNBCWw4HiO6B ...