C# Queue与RabbitMQ的爱恨情仇(文末附源码):Q与MQ消息队列简单应用(二)

简介: C# Queue与RabbitMQ的爱恨情仇(文末附源码):Q与MQ消息队列简单应用(二)

上一章我们讲了队列( Queue),这一章我们讲Message Queue消息队列,简称MQ。

定义:

  MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开发)。MQ是一种应用程序对应用程序的通信方法。

应用程序通过读写入队和出队的消息来通信,无需专用连接来链接它们。

消息传递是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,一般应用于远程过程调用的技术。

排队指的是应用程序通过队列来通信。应用队列避免接收和发送数据的同时进行。

特点:

  MQ是消费者-生产者模型的代表。一端往消息队列中写入消息,另一端可以读取或者订阅队列中的消息。

MQ遵循的是AMQP协议(高级消息队列协议:使得遵从该规范的客户端应用和消息中间件服务器的全功能互操作成为可能)的具体实现和产品。

应用:

  在使用MQ时,我们不需要实时的返回信息。获取信息和返回信息进行异步处理。

例如:在项目中,我们需要从汽车系统中利用CAN总线实时的获取汽车的相关信息,但是没有必要给汽车返回信息。

如,获取汽车的轮胎气压,但是我们不需要给汽车一个返回的信息或结果。

   C#项目要利用RabbitMQ来获取实时数据的话,需要先安装客户端的库文件:RabbitMQ.Client.dll,下面有提到。

备用下载路径:

链接:https://pan.baidu.com/s/1zcQmPnBF7WcD8sqV4W54pw
提取码:6962


写在前面:

这个就需要安装RabbitMQ服务、下载Erlang环境并安装、引入RabbitMQ.client.dll动态库。下面有官网可以下载相应的内容。

我这个使用windows 64位的,我这里整理安装程序在百度网盘,官网打开Erlang很慢的去我百度网盘下载

链接:https://pan.baidu.com/s/1zcQmPnBF7WcD8sqV4W54pw

提取码:6962


 

安装

需要安装RabbitMQ服务:

官网下载地址:http://www.rabbitmq.com/download.html

下载完成后一直点击下一步即可。

如果没有Erlang环境会弹出下面的提示:

下载Erlang环境并安装,安装时一直点下一步即可

地址:http://www.erlang.org/downloads

如果打开网页慢或者打不开的,去下载我整理也行,不过我的是windows 64的。

链接:https://pan.baidu.com/s/1zcQmPnBF7WcD8sqV4W54pw
提取码:6962

安装完成后我们需要配置环境变量,如下:

点击【计算机】右键,属性,高级系统设置,高级,环境变量,

新建一个系统变量。

输入

变量名:ERLANG_HOME,

变量值:C:\Program Files\erl9.3

变量值是你刚刚安装Erlang的路径

 

然后在找到环境变量里面的Path,点击编辑,在变量值的最后面加上  ;%ERLANG_HOME%\bin;,记得有分号(英文分号)

 

安装成功后会在服务中看到该服务。.

 

然后安装RabbitMQ,也是一直点击下一步即可,

到这里后就准备工作做完了,接下来我们就编写代码。

有的童鞋不知道为什么需要安装RabbitMQ服务和Erlang环境,我这里简单普及一下,详细的请百度一下。

RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。

RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。

所有主要的编程语言均有与代理接口通讯的客户端库。

.


代码实例:

为了讲解效果更佳,我们新建两个控制台应用程序MessageQueueClient(生产者)和MessageQueueServer(消费者),

不要急着建立,看下面的代码依次建立。

生产者 :

新建控制台应用程序MessageQueueClient,引用动态文件库RabbitMQ.Client.dll,可以去百度下载一个,上面的网盘路径里面有。

入队代码编写:

using RabbitMQ.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MessageQueueClient
{
    class Program
    {
        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);
                    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);
                    }
                }
            }
        }
    }
}

控制台入队操作,控制台这一步可以结合实际代码需求进行入队。

这里就入队成功了,接下来我们出队,也就是读取数据,这里和readis有点像,我们之前安装的RabbitMQ服务就是在这里用到了。

 

生产者 :

新建控制台应用程序MessageQueueServer,引用动态文件库RabbitMQ.Client.dll,可以去百度下载一个,上面的网盘路径里面有。

出队代码编写:

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MessageQueueServer
{
    class Program
    {
        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);
                    //输入1,那如果接收一个消息,但是没有应答,则客户端不会收到下一个消息
                    channel.BasicQos(0, 1, false);
                    Console.WriteLine("Listening...");
                    //在队列上定义一个消费者
                    QueueingBasicConsumer consumer = new QueueingBasicConsumer(channel);
                    //消费队列,并设置应答模式为程序主动应答
                    channel.BasicConsume("MyRabbitMQ", false, consumer);
                    while (true)
                    {
                        //阻塞函数,获取队列中的消息
                        BasicDeliverEventArgs ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                        byte[] bytes = ea.Body;
                        string str = Encoding.UTF8.GetString(bytes);
                        Console.WriteLine("读取队列消息:" + str.ToString());
                        //回复确认
                        channel.BasicAck(ea.DeliveryTag, false);
                    }
                }
            }
        }
    }
}

运行代码,读取队列里面的内容,遵循先入先出原则。

这样队列的数据就读取到了。

 

总结:

这是一个简单的消息队列的应用,写的比较粗浅,具体需要结合实际应用项目编写。

另外感谢大家的支持^_^

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
16天前
|
数据采集 安全 JavaScript
C#医院手术麻醉信息管理系统源码 对接院内HIS、LIS、PACS
手麻系统的功能涵盖了麻醉临床业务管理、麻醉运营业务管理以及手术进程管理等,实现了将多种麻醉病历文书与医院HIS系统的有效关联,让手术室人员、设备资源和信息资源高度共享;实现了手术安排、各种统计报表等科室管理和科研工作的需求,可借其收集临床数据、进行整合分析,为围术期临床信息、管理、科研提供整体解决方案;该系统的运行,为医护人员提供了流程化、信息化、自动化、智能化的临床业务综合管理。
29 5
|
1月前
|
消息中间件 存储 Kafka
RabbitMQ、RocketMQ和Kafka全面对决,谁是最佳选择?
1、应用场景 1.RabbitMQ: 适用于易用性和灵活性要求较高的场景 异步任务处理:RabbitMQ提供可靠的消息传递机制,适用于处理异步任务,例如将耗时的任务放入消息队列中,然后由消费者异步处理,提高系统的响应速度和可伸缩性。 解耦系统组件:通过使用RabbitMQ作为消息中间件,不同的系统组件可以通过消息进行解耦,实现松耦合的架构,提高系统的可维护性和灵活性。 事件驱动架构:RabbitMQ的发布-订阅模式可以用于构建事件驱动架构,将系统中的事件作为消息发布到相应的主题,不同的消费者可以订阅感兴趣的主题进行相应的处理。
177 2
|
1月前
|
消息中间件 Java
springboot整合消息队列——RabbitMQ
springboot整合消息队列——RabbitMQ
75 0
|
1天前
|
存储 数据采集 安全
C#医院手术室麻醉信息管理系统源码 自动生成麻醉的各种医疗文书(手术风险评估表、手术安全核查表)
医院手术麻醉信息系统有着完善的临床业务功能,能够涵盖整个围术期的工作,能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施,能够规范麻醉科的工作流程,实现麻醉手术过程的信息数字化,自动生成麻醉的各种医疗文书,完成共享HIS、LIS、PACS和EMR等手术患者信息,从而提高麻醉、手术工作的管理水平。
9 3
|
12天前
|
消息中间件 存储 Java
RabbitMQ入门指南(八):MQ可靠性
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了MQ数据持久化、LazyQueue模式、管理控制台配置Lazy模式、代码配置Lazy模式、更新已有队列为lazy模式等内容。
40 0
|
12天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012
|
20天前
|
消息中间件 存储 负载均衡
消息队列学习之RabbitMQ
【4月更文挑战第3天】消息队列学习之RabbitMQ,一种基于erlang语言开发的流行的开源消息中间件。
15 0
|
29天前
|
安全 JavaScript 前端开发
C#医院手麻系统源码,手术麻醉管理系统源码
手术麻醉管理系统贯穿患者入院至出院全程,整合术前术后流程,如手术排班、麻醉计划、术中监护及术后恢复。采用C#.net6.0、Vue、Ant-Design等技术,与sqlserver2019数据库结合。系统提供麻醉记录、手术安全核查、费用管理等功能,确保信息数字化和流程规范化。通过自动化记录和数据分析,增强手术安全,优化资源分配,并支持医疗质控与研究。
C#医院手麻系统源码,手术麻醉管理系统源码
|
1月前
|
存储 监控 安全
C#手术麻醉系统源码 大型医院手麻系统4大需求是什么?
C#编写的大型医院手术麻醉系统旨在满足四大核心需求:智慧医院建设,要求实时患者信息共享与监控;医院等级评级,强调安全评估与术后管理;电子病历评级,规定手术预约、麻醉信息的标准化;科室需求,包括系统互联、流程信息化、数据追溯、操作简便、文书完整、快速响应、生命体征动态采集及质量控制。系统提升手麻工作的效率与安全性,确保手术顺利进行。
|
1月前
|
消息中间件 存储 中间件
【SpringCloud Stream消息驱动、设计思想以及整合rabbitmq消息队列案例--学习笔记】
【SpringCloud Stream消息驱动、设计思想以及整合rabbitmq消息队列案例--学习笔记】
50 0