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服务器的连接。

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

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

  1. public IConnection GetConnection(string hostName, string userName, string password)
  2. {
  3. ConnectionFactory connectionFactory = new ConnectionFactory();
  4. connectionFactory.HostName = hostName;
  5. connectionFactory.UserName = userName;
  6. connectionFactory.Password = password;
  7. return connectionFactory.CreateConnection();
  8. }

发送和接收消息

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

  1. public static void Send(string queue, string data)
  2. {
  3. using (IConnection connection = new ConnectionFactory().CreateConnection())
  4. {
  5. using (IModel channel = connection.CreateModel())
  6. {
  7. channel.QueueDeclare(queue, false, false, false, null);
  8. channel.BasicPublish(string.Empty, queue, null, Encoding.UTF8.GetBytes(data));
  9. }
  10. }
  11. }

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

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

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

  1. public static void Receive(string queue)
  2. {
  3. using (IConnection connection = new ConnectionFactory().CreateConnection())
  4. {
  5. using (IModel channel = connection.CreateModel())
  6. {
  7. channel.QueueDeclare(queue, false, false, false, null);
  8. var consumer = new EventingBasicConsumer(channel);
  9. BasicGetResult result = channel.BasicGet(queue, true);
  10. if (result != null)
  11. {
  12. string data =
  13. Encoding.UTF8.GetString(result.Body);
  14. Console.WriteLine(data);
  15. }
  16. }
  17. }
  18. }

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

  1. static void Main(string[] args)
  2. {
  3. Send("IDG","Hello World!");
  4. Receive("IDG");
  5. Console.ReadLine();
  6. }

Copy实验结果

程序代码贴图

  • 发送端

代码如下:

  1. public class Program
  2. {
  3. static ConnectionFactory factory = new ConnectionFactory();
  4. static void Main(string[] args)
  5. {
  6. // var factory = new ConnectionFactory(); //连接 RabbitMQ 工厂实例
  7. factory.HostName = "127.0.0.1"; //要连接到的主机,默认为 localhost
  8. factory.Port = 5672; //连接断开,默认为 -1(5672)
  9. factory.UserName = "admin"; //RabbitMQ 连接用户名,默认为 guest
  10. factory.Password = "123456"; //RabbitMQ 连接密码,默认为 guest
  11. //循环发送
  12. for (int i = 1; i < 11; i++)
  13. {
  14. Console.WriteLine(i);
  15. SendData(i);
  16. }
  17. Console.ReadLine();
  18. }
  19. public static ConnectionFactory ConFactory()
  20. {
  21. var Newfactory = new ConnectionFactory();
  22. Newfactory = factory;
  23. return Newfactory;
  24. }
  25. public static void SendData(int i)
  26. {
  27. var factory = Program.ConFactory();
  28. using (var connection = factory.CreateConnection())
  29. {
  30. //创建一个新的通道、会话和模型
  31. using (var channel = connection.CreateModel())
  32. {
  33. channel.QueueDeclare("myQueue1", false, false, false, null);
  34. var properties = channel.CreateBasicProperties();
  35. properties.DeliveryMode = 1;
  36. string message = $"Hello_RabbitMQ,This is the sender. Sorting {i}"; //消息内容
  37. byte[] body = Encoding.UTF8.GetBytes(message);
  38. channel.BasicPublish("", "myQueue1", properties, body); //发送(生产)消息
  39. Console.WriteLine($"Send_Messages: {message}");
  40. // channel.Close();
  41. }
  42. // connection.Close();
  43. }
  44. }
  45. }
  • 接收端

代码如下:

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

在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. Educational Codeforces Round 88 (Rated for Div. 2) E、Modular Stability 逆元+思维

    题目链接:E.Modular Stability 题意: 给你一个n数,一个k,在1,2,3...n里挑选k个数,使得对于任意非负整数x,对于这k个数的任何排列顺序,然后用x对这个排列一次取模,如果最 ...

  2. Codeforces Round #686 (Div. 3) E. Number of Simple Paths (思维,图,bfs)

    题意:有一个\(n\)个点,\(n\)条边的图,问你长度至少为\(1\)的简单路径有多少条. 题解:根据树的性质,我们知道这颗树一定存在一个环,假如一棵树没有环,那么它的所有长度不小于\(1\)的简单 ...

  3. hdu1011 Starship Troopers

    Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submissio ...

  4. AC自动机算法 && 例题

    参考链接: https://blog.csdn.net/bestsort/article/details/82947639#commentBox https://blog.csdn.net/niush ...

  5. github host

    更改hosts文件,地址:C:\Windows\System32\Drivers\etc 不能直接修改,将其拷贝到桌面,进行修改后,再复制到文件目录下(直接替换) 在hosts文件中添加: # git ...

  6. Python-collections模块之defaultdict

    defaultdict defaultdict 是 dict 类型的子类,正如其名,初始化时,可以给key指定默认值,什么意思呢?直接看代码.如果是普通的dict对象,访问一个不存在的key时,会报错 ...

  7. Lightoj 1038 - Race to 1 Again【期望+dp】

    题目:戳这里 题意:一个数字n不断迭代地除以自身的因子得到1.求这个过程中操作除法次数的期望. 解题思路: 求概率基本都是从一个最基础的状态开始延伸推出公式,得出答案.因为每个数都有个共同的最终状态1 ...

  8. 自己yy的中缀表达式转后缀表达式(未验证完全正确)

    目前自己测试的表达式都没有出过问题 思路是这样,先将后缀表达式的计算顺序搞出来..当完全缩出来一个数的时候,如果后面还有要计算的,我们就把它放到后缀表达式的后面 先算后面的..不断迭代.. #incl ...

  9. js screen size check

    js screen size check js 屏幕尺寸检测 window.screen API screen; window.screen.width; window.screen.height; ...

  10. 如何使用 js 实现一个 Promise.all 方法 PromiseAll

    如何使用 js 实现一个 Promise.all 方法 PromiseAll Promise.all PromiseAll https://developer.mozilla.org/en-US/do ...