如何在 C# 中使用 RabbitMQ

译文链接:https://www.infoworld.com/article/3200210/how-to-work-with-rabbitmq-in-c.html

RabbitMQ 是一个非常流行的,开源的,使用Erlang语言编写的框架,通常在电信级平台中作为消息中间件使用,RabbitMQ实现了高级的AMQP协议用于实现进程间,应用程序间,服务器之间的消息交互,而且它还有一个非常????????的特性,你可以使用自定义插件来扩展RabbitMQ的功能,而且它还支持多协议,高性能,高可靠,集群以及高可用队列。

创建队列的方式也多种多样,你可以编码创建,也可以通过管理员用户界面,甚至通过 PowerShell 进行队列创建。

RabbitMQ 术语

当你在用 RabbitMQ 时,你要理解下面两个术语

  • 队列是一个数据结构上的概念,支持 FIFO 特性,在本文中,消息队列就是一个可以存放消息的巨大缓存。

  • producer(生产者) 的使命是生成数据并推送到队列的一种角色组件,consumer(消费者)它能够从存储消息的队列中提取数据进行消费,生产者-消费者 是并行编程中非常流行的设计模式之一。

安装和启动

安装 RabbitMQ 是非常简单的,在安装之前,你需要先安装 Erlang,根据你的操作系统选择正确版本呢的 Erlang,下载地址:https://www.erlang.org/downloads  ,然后继续下载安装 RabbitMQ Server ,下载地址:https://www.rabbitmq.com/download.html

用 C# 构建 RabbitMQ

现在 Erlang 和 RabbitMQ 已经成功安装到你的windows上,如果想和 Rabbitmq Server 进行交互,你需要安装一个 RabbitMQ .NET client , 可以用 NuGet Package Manager 控制台去安装 RabbitMQ Client。

在 Visual Studio 中新建一个 Console Application,然后通过 NuGet Package Manager 安装 RabbitMQ.Client 开发包,假定 RabbitMQ Server 是运行在本机,下面的代码片段创建了一个和 RabbitMQ Server 交互的 Connection 连接,代码如下:


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

现在再次假定 RabbitMQ 跑在远程服务器上,下面的方法返回了一个通往 Rabbitmq Service 的 Connection 连接。


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 Service 已经在本地正常运行,使用下面的方法向队列发送消息,请注意通往 RabbitMQ Service 的 Connection 用的是默认配置。


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));}}}

channel 常用于和 server 进行通讯从而发送和接收消息,不过上面这种队列是不持久的,为啥这么说呢?因为我在 QueueDeclare 方法的第二个参数中设置了 false,所以送往这个 queue 的 message 只会存留于内存中,一旦 server 重启,这个数据将会丢失。

下面的代码展示了如何从 queue 中消费数据。

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();
}

值得一提的是:RabbitMQ 对持久化也提供了非常好的支持,有两种模式的 queue 可供选择:持久化和非持久化,如果采用持久化模式,消息是存放在硬盘中的,反之非持久化的模式,数据仅仅存放于内存中,一旦server重启,非持久化模式的队列数据将会丢失,最后补充一下,持久化可以用于以下三个级别上:Queue,Exchange 和 Message。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法设计与分析——递归与分治——归并排序

归并排序采用的是一种分治的思想,如下图,先将要排序的元素分为两块,每个块又开始分裂,然后逐个按照特定顺序合并,合成最后我们需要的数组。 归并排序的复杂度: 时间复杂度:O(nlogn) 空间复杂度&…

git 回退上一个版本_Git小白使用教程:详细、显现、真正手把手教!

不少小伙伴私信问我GitHub怎么使用?今天更一下,希望能帮到你,有问题评论区拍砖交流吧。

在传统行业做数字化转型之业务篇

【数字化转型】| 作者 / Edison Zhou这是EdisonTalk的第307篇原创内容在过去的两年时间里,我加入了一家传统行业的企业参与其数字化转型的过程,现在我将我的经历分享出来,本文是第三部分—业务篇,主要会介绍一下传统企业通用的三大…

算法设计与分析——递归与分治策略——快速排序

快速排序——递归算法 处理i,j的先后顺序不能改变 快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 函数…

git pull 覆盖本地_SVN与Git比较的优缺点差异

一、 集中式vs分布式1. Subversion属于集中式的版本控制系统集中式的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。Subversion的特点概括起…

C#阻塞队列BlockingCollection

BlockingCollection是一个比较冷门的类,我们先看下官方对这个类的定义:简单来说,BlockingCollection就是一个线程安全的阻塞队列,利用阻塞这个特性,我们可以实现进程内的生产者-消费者模式,比如消息转发、日…

算法设计与分析——递归与分治策略——线性时间选择

顾名思义&#xff1a;这篇文章讲解的就是如果用线性时间算法来作出元素选择问题。 问题描述&#xff1a;给定线性序集中n个元素和一个整数k&#xff0c;1<k<n.要求找出这n个元素中第k小的元素&#xff0c;即如果将这个n个元素依其线性序排列时&#xff0c;排在第k个位置的…

如何在 .NET 中使用 Redis缓存

译文链接&#xff1a;https://www.infoworld.com/article/3187905/how-to-work-with-redis-cache-in-net.html缓存是一种状态管理机制&#xff0c;通常用于提升你的应用程序性能&#xff0c;它很大程度上能够减少一个请求对你系统资源的消耗。Redis是一个开源的&#xff0c;高性…

git push被拒绝_规范git项目提交并自动生成项目commit log

commit message 是开发的日常操作, 好的 log 不仅有助于他人 review, 还可以有效的输出 CHANGELOG, 对项目的管理实际至关重要, 但是在平时工作时&#xff0c;只依赖大致的开发规范和自觉&#xff0c;很难形成一种普遍约束。而通过本文&#xff0c;对项目进行一些基础配置&…

算法设计与分析——递归与分治策略——全排列

算法设计与分析——递归与分治策略——全排列 全排列问题的解决是通过分治与递归思想来解决的 首先判断是否递归到了最后一位&#xff0c;如果递归到了最后一位&#xff0c;则输出他当前的全排列序列。 如果没有到达最后一位&#xff0c;则循环的交换该第K个元素与其后面的所有…

asp.net core 集成 prometheus

asp.net core 集成 prometheusIntroPrometheus 是一个开源的现代化&#xff0c;云原生的系统监控框架&#xff0c;并且可以轻松的集成 PushGateway, AlertManager等组件来丰富它的功能。对于 k8s 下部署的系统来说使用 Prometheus 来做系统监控会是一个比较不错的选择&#xff…

vba 不等于_EXCEL中VBA基础语句(1)

萌二笔记分类目录及书单一、If-Then语句 说明&#xff1a;条件判断&#xff0c;如果......那么......例1&#xff1a;A2单元格的成绩大于等于60&#xff0c;则弹出对话框提示“及格”。Sub 判断成绩()If Range("A2") > 60 Then MsgBox "及格"End Sub操作…

PHP大势已去,PHP宝藏可为我所用

编者注&#xff1a; PHP有着庞大的生态系统&#xff0c;还是可以为我dotnet所用&#xff1a;介绍一个基于 .NET 的船的新 PHP SDK Runtime: PeachPie。PHP 8 昨天发布了&#xff0c;今天不写代码&#xff0c;聊聊我对 PHP 的看法。昨天在今日头条发了一条微头条&#xff0c;引…

leetcode——242. 有效的字母异位词

问题描述&#xff1a; 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s “anagram”, t “nagaram” 输出: true 示例 2: 输入: s “rat”, t “car” 输出: false 说明: 你可以假设字符串只包含小写字母。 进阶: 如…

python常用函数和操作_python一条语句分析几个常用函数和概念 -

前言 过年也没完全闲着&#xff0c;每天用一点点时间学点东西&#xff0c;本文为大家介绍几个python操作的细节&#xff0c;包含all、any、for in等操作&#xff0c;以及介绍我解决问题的思路。 一、开篇 先从我看到的一个简单的语句开始。 刚看到这个语句的时候我整个人完全懵…

.NET5发布了,腾讯招聘点名要求精通MySQL,而不是SQLServer!

.NET5正式发布&#xff0c;社区一片欢腾&#xff0c;.NET相关技术栈也会迎来大变革&#xff0c;而大厂的招聘要求可谓是技术风向标&#xff01;紧盯腾讯网易顺丰等大厂的招聘&#xff0c;会发现都在明确要求。MySQL&#xff0c;而不是SQL Server了。究其根本&#xff0c;还是跨…

leetcode——344. 反转字符串

leetcode——344. 反转字符串 问题概述&#xff1a; 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假…

python面向对象编程思想书籍_Python的面向对象编程思想

什么是Python的多态&#xff1f;多态的好处就是&#xff0c;当我们需要传入Dog、Cat、Tortoise……时&#xff0c;我们只需要接收Animal类型就可以了&#xff0c;因为Dog、Cat、Tortoise……都是Animal类型&#xff0c;然后&#xff0c;按照Animal类型进行操作即可。由于Animal…

C# WPF:把文件给我拖进来!!!

❝首发公众号&#xff1a;Dotnet9作者&#xff1a;沙漠之尽头的狼日期&#xff1a;202-11-27一、本文开始之前上传文件时&#xff0c;一般是提供一个上传按钮&#xff0c;点击上传&#xff0c;弹出文件&#xff08;或者目录选择对话框&#xff09;&#xff0c;选择文件&#xf…

c++——reverse()函数的使用

c——reverse()函数的使用 使用方式&#xff1a; reverse(vec.begin(),vec.end()); queue和stack容器不支持遍历操作&#xff0c;没有迭代器&#xff0c;所以不能使用算法里的反转函数&#xff0c;其类也没有提供反转的成员函数 因为set和map是关联式容器&#xff0c;在插入元…