RabbitMQ初步使用,简洁介绍。
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初步使用,简洁介绍。的更多相关文章
- 消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ&Redis的重点介绍与简单应用 消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下 ...
- RabbitMQ基础概念详细介绍
http://blog.csdn.net/column/details/rabbitmq.html 转至:http://www.ostest.cn/archives/497 引言 你是否遇到过两个(多 ...
- 【RabbitMQ】工作模式介绍
一.前言 之前,笔者写过< CentOS 7.2 安装 RabbitMQ> 这篇文章,今天整理一下 RabbitMQ 相关的笔记便于以后复习. 二.模式介绍 在 RabbitMQ 官网上提 ...
- 进击的Python【第十一章】:消息队列介绍、RabbitMQ&Redis的重点介绍与简单应用
消息队列介绍.RabbitMQ.Redis 一.什么是消息队列 这个概念我们百度Google能查到一大堆文章,所以我就通俗的讲下消息队列的基本思路. 还记得原来写过Queue的文章,不管是线程queu ...
- 消息中间件-RabbitMq相关概念及原理介绍【图文并茂】
消息中间件 消息中间件的作用 解耦:消息中间件在服务之间插入了一个隐含的.基于数据的接口层.两边的服务处理过程都要实现这一接口,这允许我们独立的扩展或修改两边的处理过程,只要确保他们遵守相同的规范约束 ...
- rabbitMq 初步
RabbitMQ的工作原理 它的基本结构 组成部分说明如下: Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue. Exchange:消息队列交换机,按一定的规则将消息路 ...
- RabbitMQ组成及原理介绍-3
rabbitmq作为成熟的企业消息中间件,实现了应用程序间接口调用的解耦,提高系统的吞吐量. 1.RabbitMQ组成 是由 LShift 提供的一个 Advanced Message Queuing ...
- RabbitMQ中Queue详细介绍
新建队列 新建Queue时有很多参数,都代表什么含义,在这里解释一下: 前述:Rabbit版本为3.7.6 ErLang 版本为 21.0.1 Name 必填项,队列的名字,建议格式可以为多个字段,表 ...
- RabbitMQ安全相关的网络资源介绍
无法用guest远程訪问RabbitMQ的的解决方式 Can't access RabbitMQ web management interface after fresh install http:/ ...
随机推荐
- hdu4507吉哥系列故事——恨7不成妻 (数位dp)
Problem Description 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: ...
- hdu4686 Arc of Dream
Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Submission ...
- Codeforces Round #646 (Div. 2) E. Tree Shuffling dfs
题意: 给你n个节点,这n个节点构成了一颗以1为树根的树.每一个节点有一个初始值bi,从任意节点 i 的子树中选择任意k个节点,并按他的意愿随机排列这些节点中的数字,从而产生k⋅ai 的成本.对于一个 ...
- CF1466-C. Canine poetry
CF1466-C. Canine poetry 题意: 给出一个字符串,这个字符串里面可能会包含多个回文子字符串.现在你可以任意修改这个字符串中的任意一个字符任意次数,问你最少多少操作数之后这个字符串 ...
- Kafka SASL/SCRAM+ACL实现动态创建用户及权限控制
kafka系列文章 第一章 linux单机安装kafka 第二章 kafka--集群安裝部署(自带zookeeper) 第三章 Kafka SASL/SCRAM+ACL实现动态创建用户及权限控制 Ka ...
- Kafka官方文档V2.7
1.开始 1.1 简介 什么是事件流? 事件流相当于人体的中枢神经系统的数字化.它是 "永远在线 "世界的技术基础,在这个世界里,业务越来越多地被软件定义和自动化,软件的用户更是软 ...
- 牛客网多校第7场 J Sudoku Subrectangles 【构造】
题目:戳这里 题意:给一个n*m的矩阵,里面由a~z及A~Z构成,问有多少个子矩阵满足任意一行或一列中都没有相同的字母. 解题思路:左上角和右下角两点可以确定一个矩阵.可以先预处理出来每个点作为一个矩 ...
- how to auto open demo and create it in a new codesandbox
how to auto open demo and create it in a new codesandbox markdown & iframe https://ant.design/do ...
- vue-cli-service & @vue/cli-service
vue-cli-service & @vue/cli-service https://www.npmjs.com/package/@vue/cli-service https://yarnpk ...
- Python Web Framework All In One
Python Web Framework All In One Django and Flask are the top Python web frameworks so far. Django ht ...