网站首页 > 技术文章 正文
Message Queue消息队列,简称MQ
C#项目要利用RabbitMQ来获取实时数据的话,需要
①安装RabbitMQ服务、
②下载Erlang环境并安装、
③引入RabbitMQ.client.dll动态库
准备工作
首先,我们访问官网【https://www.rabbitmq.com/】,点击Get Started。
然后,网站会自动跳转到当前首页Get Started的锚点位置,如下图:
Get Started锚点:
然后我们点击DownLoad+Installation,进入到下载界面。
在下载页面中,我们找到安装指南,然后在点击官网推荐的Windows系统的安装包,如下图:
现在,我们进入了Windows安装指南界面了。
首先,我们看一下预览信息,如下图:
在预览里,我们得知,安装RabbitMQ有两种方法,一种是使用Chocolatey安装,一种是使用官方安装包安装。
Chocolatey是什么呢?随手百度一下,原来他是一个软件包管理工具,也就是说,Chocolatey是类似于Nuget的一种工具。
由于Chocolatey的使用,我不是很熟悉,所以,这里选择使用官方安装包安装。
点击【Using the official installer】,我们进入了【Using the official installer】对应的锚点,如下图。
在【Using the official installer】段落里找到有推荐标志的安装包,然后下载。
下载完成后,我们可以得到这样一个安装包,如下图:
除了下载安装包,我们还会发现,在【Using the official installer】段落里,有提醒我们,RabbitMQ是有依赖的,依赖一个Erlang语言的框架(类似于C#语言的NetFramework)。
我们可以发现,在依赖的段落里,官网非常坑的给出了三个链接网址,如下:
supported version of Erlang:https://www.rabbitmq.com/which-erlang.html
Windows installer:https://www.erlang.org/downloads
Erlang Solutions:https://www.erlang-solutions.com/resources/download.html
因为,我们是无法通过文字描述来判断,哪一个是真的依赖框架的下载地址,所以只好每个都点击进去看看。。。
打开网址后发现,在后两个网址中都可以找到框架下载地址,但第二个地址明显更友好一点,所以我们在第二个网址内下载Erlang的框架。
下载完成得到如下图文件:
PS:这里下载的是OTP的22.1的版本,我的理解是Erlang等于C#语言,而OTP等于NetFramework。
安装Erlang\OTP
首先,我们运行otp_win64_22.1.exe,安装依赖框架Erlang\OTP。
安装完成后,设置环境变量如下:
然后运行CMD,输入erl,测试安装是否成功,如下图:
安装成功。
安装rabbitmq-server
安装完依赖后,我们接着安装rabbitmq-server-3.8.0.exe。
【rabbitmq-server-3.8.0.exe】?从这个文件名上,我们发现了一个问题,那就是,我们即将安装的RabbitMQ,是一个服务端啊。
什么?服务端?难道还有客户端???
其实这也很好理解,想一下最开始我举的那个例子,消息队列是需要一个监听端口的服务端的,然后客户端向这个服务端发送请求。
这样是不是就很好的理解RabbitMQ了呢:)
----------------------------------------------------------------------------------------------------
安装完RabbitMQ服务端后,我们还是启动CMD,用命令行来查看下安装状态。
首先输入下面的命令,将路径定位到RabbitMQ的路径下:
【CD /D C:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.0\sbin】
然后输入rabbitmqctl status查看状态。
启动管理工具的命令行:rabbitmq-plugins enable rabbitmq_management。
启动成功后,在浏览器输入地址http://127.0.0.1:15672/,进入管理页面,账户密码都是guest。
C#里使用RabbitMQ开源类库非常简单,可以去官网下载一个.NET版本的RabbitMQ客户端类库,也可以直接在Nuget上搜索RabbitMQ,然后安装,如下图:
到此,RabbitMQ服务端的环境配置好了,正常情况,这些配置应该在服务器进行,但我为了测试方便,就把服务端也安装在本机了,因此我下面调用RabbitMQ时,连接的主机IP都是localhost。
实例代码:
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp7
{
class Program
{
private static ManualResetEvent resetEvent = new ManualResetEvent(false);
[Obsolete]
static void Main(string[] args)
{
//生产者
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = "127.0.0.1";
//默认端口
factory.Port = 5672;
using (IConnection conn = factory.CreateConnection())
{
using (IModel channel = conn.CreateModel())
{
//在MQ上定义一个持久化队列,如果名称相同不会重复创建
channel.QueueDeclare("MyRabbitMQ", true, false, false, null);
Task.Run(() =>
{
while (true)
{
string message = string.Format("{0}", Console.ReadLine()); //Console.ReadLine()为控制台输入的内容,我们可以用其他方式获取
byte[] buffer = Encoding.UTF8.GetBytes(message);
IBasicProperties properties = channel.CreateBasicProperties();
properties.DeliveryMode = 2;
channel.BasicPublish("", "MyRabbitMQ", properties, buffer); //入队
Console.WriteLine("入队成功:" + message);
resetEvent.Set();
}
});
while (resetEvent.WaitOne(60 * 1000))
{
//输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
channel.BasicQos(0, 1, false);
Console.WriteLine("Listening...");
//在队列上定义一个消费者
QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
//消费队列,并设置应答模式为程序主动应答
运行后在控制台输入字符串,之后就会有接收的字符串出来,,
一般入队代码和出队代码是写在两个控制台,分别放两个主机上执行的,为了方便测试我放在了一起 !
- 上一篇: RabbitMQ如何防止消息丢失和重复消费
- 下一篇: RabbitMQ 如何实现数据100%不丢失
猜你喜欢
- 2024-10-02 「2021最新版」RabbitMQ面试题总结,每道题都很经典
- 2024-10-02 RabbitMQ如何保证消息不丢失 运城丢失女孩最新消息
- 2024-10-02 用 RabbitMQ 延迟队列,实现消息延迟推送
- 2024-10-02 RabbitMQ如何保证消息不丢失? 山西丢失孩子最新消息
- 2024-10-02 超详细的RabbitMQ入门,看这篇就够了
- 2024-10-02 3分钟阅读技术干货,一步一步的理解RabbitMQ
- 2024-10-02 周日福利--消息队列学习必备宝典(RabbitMQ实战指南)
- 2024-10-02 RabbitMQ 如何实现数据100%不丢失
- 2024-10-02 RabbitMQ 持久化和权重分配消息 rabbitmq的持久化和确认机制
- 2024-10-02 RabbitMQ如何防止消息丢失和重复消费
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)