热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RabbitMQ安装以及简单操作应用(针对Windows和C#)

1.RabbitMQ安装1.1下载并安装Erlanghttps://www.erlang.org/

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安装以及简单操作应用(针对Windows和C#) - 文章图片

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

RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片

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

查看已有用户及角色

rabbitmqctl.bat list_users

RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片

创建新用户

rabbitmqctl.bat add_user userName password

RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片

给新用户授权administrator角色

rabbitmqctl.bat set_user_tags userName administrator

RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片

删除某个用户

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中,消息产生者、交换机、队列和消息消费者的关系如下图所示。

RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片

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

IModel.ExchangeDeclare(string exchange, string type, bool durable, bool autoDelete, IDictionaryarguments)

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, IDictionaryarguments)

与交换机声明相比,多了一个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, IDictionaryarguments)

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

RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片

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的代码如下:

RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片

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队列中。

RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片

 RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片

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

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

RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片

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事件了。

RabbitMQ安装以及简单操作应用(针对Windows和C#) - 文章图片

主要参考:

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

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


推荐阅读
  • Windows下安装RaibbitMQ
    1.软件准备1.1erlang语言包到http:www.erlang.orgdownload.html下载,并且运行!安装目录C:\ProgramFil ... [详细]
  • SecureCRT是一款功能强大的终端仿真软件,支持SSH1和SSH2协议,适用于在Windows环境下高效连接和管理Linux服务器。该工具不仅提供了稳定的连接性能,还具备丰富的配置选项,能够满足不同用户的需求。通过SecureCRT,用户可以轻松实现对远程Linux系统的安全访问和操作。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • Windows环境下RabbitMQ安装详尽指南
    Windows环境下RabbitMQ安装详尽指南 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
  • 从单机存储进化为接口和存储的分离概述接口服务层对外提供REST服务,数据服务层提供数据存储功能。两者之间通过消息队列进行通信,数据服务层的所有数据服 ... [详细]
  • 本文介绍了如何使用 Google Colab 的免费 GPU 资源进行深度学习应用开发。Google Colab 是一个无需配置即可使用的云端 Jupyter 笔记本环境,支持多种深度学习框架,并且提供免费的 GPU 计算资源。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • MicrosoftDeploymentToolkit2010部署培训实验手册V1.0目录实验环境说明3实验环境虚拟机使用信息3注意:4实验手册正文说 ... [详细]
  • 解决Parallels Desktop错误15265的方法
    本文详细介绍了在使用Parallels Desktop时遇到错误15265的多种解决方案,包括检查网络连接、关闭代理服务器和修改主机文件等步骤。 ... [详细]
  • Unity与MySQL连接过程中出现的新挑战及解决方案探析 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 本文详细介绍了如何在Java Web服务器上部署音视频服务,并提供了完整的验证流程。以AnyChat为例,这是一款跨平台的音视频解决方案,广泛应用于需要实时音视频交互的项目中。通过具体的部署步骤和测试方法,确保了音视频服务的稳定性和可靠性。 ... [详细]
  • CentOS7 安装RabbitMQ
    1安装编译工具yuminstall-ymakegccgcc-c++m4opensslopenssl-develncurses-develunixODBCunixODBC-devel ... [详细]
  • php redis 消息队列_redis怎么实现消息队列?
    把瞬间服务器的请求处理换成异步处理,缓解服务器的压力,实现数据顺序排列获取。本文主要和大家分享redis如何实现消息队列,希望能帮助到大家 ... [详细]
author-avatar
七仙女跳皮筋
这个家伙很笨,什么也不会!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有