RabbitMQ是一种越来越流行的开源,快速消息代理,它使用Erlang编写并基于Open Telecom Platform框架构建。它实现了高级消息队列协议(AMQP),用于在进程,应用程序和服务器之间交换数据。它特别具有吸引力,

因为它可以通过插件支持进行扩展,支持许多协议,并提供高性能,可靠性,集群和高可用性队列。

通过编写代码,通过管理用户界面或通过PowerShell在RabbitMQ中创建队列。

RabbitMQ条款

使用RabbitMQ时,应注意两个术语:

  • 甲队列是一种数据结构,FIFO的基础上(在第一出第一)上工作。在这种情况下,队列是可以容纳数据的大型消息缓冲区。
  • 甲生产者是产生被推到队列一些数据的组件; 它将数据发送到队列,而使用者是使用队列中存储的数据的使用者。(生产者-消费者模式是并行编程中使用最广泛的模式之一。)

安装与设定

设置RabbitMQ非常简单。在安装RabbitMQ之前,您应该安装Erlang。 根据您使用的操作系统下载正确版本的Erlang。接下来,下载并安装RabbitMQ服务器。

用C#编程RabbitMQ

已经在系统中安装了Erlang和RabbitMQ,则需要安装RabbitMQ .Net客户端以连接到RabbitMQ服务并与之一起使用。您可以通过NuGet软件包管理器安装RabbitMQ客户端。

在Visual Studio中创建一个新的控制台应用程序。接下来,通过NuGet软件包管理器安装RabbitMQ.Client软件包。假设RabbitMQ服务器在系统中本地运行,则以下代码段可用于创建与RabbitMQ服务器的连接。

ConnectionFactory connectionFactory = new ConnectionFactory();
IConnection connection = connectionFactory.CreateConnection();

现在,假设RabbitMQ服务正在远程系统中运行。这是一种使您返回到RabbitMQ服务的连接实例的方法。

public IConnection GetConnection(string hostName, string userName, string password)
{
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.HostName = hostName;
connectionFactory.UserName = userName;
connectionFactory.Password = password;
return connectionFactory.CreateConnection();
}

发送和接收消息

在系统本地运行RabbitMQ服务的情况下,请使用以下方法将消息发送到队列。请注意,已使用默认设置建立了与RabbitMQ服务的连接。

public static void Send(string queue, string data)
{
using (IConnection connection = new ConnectionFactory().CreateConnection())
{
using (IModel channel = connection.CreateModel())
{
channel.QueueDeclare(queue, false, false, false, null);
channel.BasicPublish(string.Empty, queue, null, Encoding.UTF8.GetBytes(data));
}
}
}

通道用于与服务器建立通信以发送和接收消息。使用此方法发送到队列的消息并不持久-我已将false第二个参数传递给该QueueDeclare方法。

因此,使用此方法发送的消息仅保留在内存中,并且无法在服务器重启后幸免。

以下方法说明了如何使用先前存储在队列中的数据。

public static void Receive(string queue)
{
using (IConnection connection = new ConnectionFactory().CreateConnection())
{
using (IModel channel = connection.CreateModel())
{
channel.QueueDeclare(queue, false, false, false, null);
var consumer = new EventingBasicConsumer(channel);
BasicGetResult result = channel.BasicGet(queue, true);
if (result != null)
{
string data =
Encoding.UTF8.GetString(result.Body);
Console.WriteLine(data);
}
}
}
}

下一个代码段显示了如何调用Send以及Receive我们在本文中创建的方法:

static void Main(string[] args)
{
Send("IDG","Hello World!");
Receive("IDG");
Console.ReadLine();
}

Copy实验结果

程序代码贴图

  • 发送端

代码如下:

public class Program
{
static ConnectionFactory factory = new ConnectionFactory();
static void Main(string[] args)
{
// var factory = new ConnectionFactory(); //连接 RabbitMQ 工厂实例
factory.HostName = "127.0.0.1"; //要连接到的主机,默认为 localhost
factory.Port = 5672; //连接断开,默认为 -1(5672)
factory.UserName = "admin"; //RabbitMQ 连接用户名,默认为 guest
factory.Password = "123456"; //RabbitMQ 连接密码,默认为 guest //循环发送
for (int i = 1; i < 11; i++)
{
Console.WriteLine(i);
SendData(i); }
Console.ReadLine();
} public static ConnectionFactory ConFactory()
{
var Newfactory = new ConnectionFactory();
Newfactory = factory;
return Newfactory;
}
public static void SendData(int i)
{
var factory = Program.ConFactory();
using (var connection = factory.CreateConnection())
{
//创建一个新的通道、会话和模型
using (var channel = connection.CreateModel())
{
channel.QueueDeclare("myQueue1", false, false, false, null);
var properties = channel.CreateBasicProperties();
properties.DeliveryMode = 1; string message = $"Hello_RabbitMQ,This is the sender. Sorting {i}"; //消息内容
byte[] body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish("", "myQueue1", properties, body); //发送(生产)消息
Console.WriteLine($"Send_Messages: {message}");
// channel.Close();
}
// connection.Close();
}
}
}
  • 接收端

代码如下:

class Program
{
static void Main(string[] args)
{
var factory = new ConnectionFactory(); //连接 RabbitMQ 工厂实例 factory.HostName = "127.0.0.1"; //要连接到的主机,默认为 localhost
factory.Port = 5672; //连接断开,默认为 -1(5672)
factory.UserName = "admin"; //RabbitMQ 连接用户名,默认为 guest
factory.Password = "123456"; //RabbitMQ 连接密码,默认为 guest //不能放入 using 语句中,否则当 using 语句结束后会 Close 连接,EventingBasicConsumer.Received 事件将不会被触发
var connection = factory.CreateConnection();
var channel = connection.CreateModel();
channel.QueueDeclare("myQueue1", false, false, false, null);
var consumer = new EventingBasicConsumer(channel); //消费者(指定消息通道)
channel.BasicConsume("myQueue1", true, consumer); //消费消息(在当前通道中监听 myQueue1 队列,并进行消费) //该事件在接收到消息时触发 consumer.Received += (sender, e) =>
{
byte[] body = e.Body.ToArray(); //消息字节数组
string message = Encoding.UTF8.GetString(body); //消息内容
Console.WriteLine($"Receive_Messages: {message}");
};
Console.ReadLine();
connection.Close();
channel.Close();
}
}

在RabbitMQ中的持久性

RabbitMQ为持久性提供了出色的支持。您可以有两种类型的队列:持久队列和非持久队列。持久队列使消息保留在磁盘上,而非持久队列仅保留在内存中。因此,服务器重新启动后,“持久”队列中的消息可用,而“非持久”队列中的消息丢失。

您可以在三个级别上设置持久性:队列,交换和消息。

附:

RabbitMQ 用户常用命令

  • 进 RabbitMQ 命令:

    CMD: CD C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.1\sbin
  • 创建 admin 用户并指定密码:

    rabbitmqctl add_user admin adminli
  • 设置 admin 用户读写所有队列的权限:

    rabbitmqctl set_permissions admin ".*" ".*" ".*"
  • 设置 admin 用户所属的用户组:

    rabbitmqctl set_user_tags admin administrator
  • 查看用户列表:

    rabbitmqctl list_users
  • 修改 admin 用户的密码为 admin123:

    rabbitmqctl change_password admin admin123
  • 删除 admin 用户:

    rabbitmqctl delete_user admin

注:以上代码本人亲自实验过,文章内容转自Infoworld社区

RabbitMQ初步使用,简洁介绍。的更多相关文章

  1. 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...

  2. RabbitMQ基础概念详细介绍

    http://blog.csdn.net/column/details/rabbitmq.html 转至:http://www.ostest.cn/archives/497 引言 你是否遇到过两个(多 ...

  3. 【RabbitMQ】工作模式介绍

    一.前言 之前,笔者写过< CentOS 7.2 安装 RabbitMQ> 这篇文章,今天整理一下 RabbitMQ 相关的笔记便于以后复习. 二.模式介绍 在 RabbitMQ 官网上提 ...

  4. 进击的Python【第十一章】:消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用

    消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queu ...

  5. 消息中间件-RabbitMq相关概念及原理介绍【图文并茂】

    消息中间件 消息中间件的作用 解耦:消息中间件在服务之间插入了一个隐含的.基于数据的接口层.两边的服务处理过程都要实现这一接口,这允许我们独立的扩展或修改两边的处理过程,只要确保他们遵守相同的规范约束 ...

  6. rabbitMq 初步

    RabbitMQ的工作原理 它的基本结构 组成部分说明如下: Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue. Exchange:消息队列交换机,按一定的规则将消息路 ...

  7. RabbitMQ组成及原理介绍-3

    rabbitmq作为成熟的企业消息中间件,实现了应用程序间接口调用的解耦,提高系统的吞吐量. 1.RabbitMQ组成 是由 LShift 提供的一个 Advanced Message Queuing ...

  8. RabbitMQ中Queue详细介绍

    新建队列 新建Queue时有很多参数,都代表什么含义,在这里解释一下: 前述:Rabbit版本为3.7.6 ErLang 版本为 21.0.1 Name 必填项,队列的名字,建议格式可以为多个字段,表 ...

  9. RabbitMQ安全相关的网络资源介绍

    无法用guest远程訪问RabbitMQ的的解决方式 Can't access RabbitMQ web management interface after fresh install http:/ ...

随机推荐

  1. codeforces Looksery Cup 2015 C. The Game Of Parity

    There are n cities in Westeros. The i-th city is inhabited by ai people. Daenerys and Stannis play t ...

  2. JavaScript——面向对象与原型

    在最外面使用this,此时this是window作用域下的,因此他指向全局变量 对象冒充: 实例属性不会共享!

  3. nginx的log、upstream和server

    一.log 首先一个log格式化的例子. #配置格式main的log log_format main '$host $status [$time_local] $remote_addr [$time_ ...

  4. Qt开发Activex笔记(一):环境搭建、基础开发流程和演示Demo

    前言   使用C#开发动画,绘图性能跟不上,更换方案使用Qt开发Qt的控件制作成OCX以供C#调用,而activex则是ocx的更高级形式.  QtCreator是没有Active控件项目的,所有需要 ...

  5. windows cmd 查看远程连接端口

    查看远程端口号 Cmd tasklist  /svc 在输出的内容中查找svchost.exe进程下termservice服务对应的PID,在此查看的PID为:276 然后输入命令:netstat   ...

  6. LeetCode 856. Score of Parentheses 括号的分数

    其实是这道题的变式(某港带同学的C/C++作业) 增加一点难度,输入的S不一定为平衡的,需要自己判断是否平衡,若不平衡输出为0. 题目描述 Given a parentheses string s, ...

  7. codeforces 6E (非原创)

    E. Exposition time limit per test 1.5 seconds memory limit per test 64 megabytes input standard inpu ...

  8. 如何在 macOS 上进行滚动截屏

    如何在 macOS 上进行滚动截屏 Shift-Command-5 https://support.apple.com/zh-cn/guide/mac-help/mh26782/mac demo Xn ...

  9. learning free programming resources form top university of the world

    learning free programming resources form top university of the world Harvard university https://www. ...

  10. Azure Functions(二)集成 Azure Blob Storage 存储文件

    一,引言 上一篇文章有介绍到什么是 SeverLess ,ServerLess 都有哪些特点,以及多云环境下 ServerLess 都有哪些解决方案.在这众多解决方案中就包括 Function App ...