RabbitMQ 消息队列编程

安装与配置

安装 RabbitMQ

读者可以在 RabbitMQ 官方文档中找到完整的安装教程:Downloading and Installing RabbitMQ — RabbitMQ

本文使用 Docker 的方式部署。

RabbitMQ 社区镜像列表:https://hub.docker.com/_/rabbitmq

创建目录用于映射存储卷:

mkdir -p /opt/lib/rabbitmq

部署容器:

docker run -itd --name rabbitmq -p 5672:5672 -p 15672:15672 \
-v /opt/lib/rabbitmq:/var/lib/rabbitmq \
rabbitmq:3.12.8-management

部署时占用两个端口。5672 是 MQ 通讯端口,15672 是 Management UI 工具端口。

打开 15672 端口,会进入 Web 登录页面,默认账号密码都是 guest。

image-20231114142145244

image-20231114142240075

关于 RabbitMQ Management UI 的使用方法,后续再介绍。

打开管理界面后会,在 Exchanges 菜单中,可以看到如下图表格。这些是默认的交换器。现在可以不需要了解这些东西,后面会有介绍。

Virtual hostNameTypeFeatures
/(AMQP default)directD
/amq.directdirectD
/amq.fanoutfanoutD
/amq.headersheadersD
/amq.matchheadersD
/amq.rabbitmq.tracetopicD I
/amq.topictopicD

image-20231114142616280

发布与订阅模型

使用 C# 开发 RabbitMQ,需要使用 nuget 引入 RabbitMQ.Client,官网文档地址:.NET/C# RabbitMQ Client Library — RabbitMQ

在继续阅读文章之前,请先创建一个控制台程序。

生产者、消费者、交换器、队列

为了便于理解,本文制作了几十张图片,约定一些图形表示的含义:

对应生产者,使用如下图表示:

p

对于消费者,使用如下图表示:

C

对于消息队列,使用如下图表示:

Q

对于交换器,使用如下图表示:

X

在 RabbitMQ 中,生产者发布的消息是不会直接进入到队列中,而是经过交换器(Exchange) 分发到各个队列中。前面提到,部署 RabbitMQ 后,默认有 七个交换器,如 (AMQP default)amq.direct 等。

当然,对于现在来说,我们不需要了解交换器,所以,在本节的教程中,会使用默认交换器完成实验。

忽略交换器存在的情况下,我们可以将生产和消费的流程简化如下图所示:

s1

请一定要注意,图中省略了交换器的存在,因为使用的是默认的交换器。但是生产者推送消息必须是推送到交换器,而不是队列,这一句一定要弄清楚。

对于消费者来说,要使用队列,必须确保队列已经存在。


ConnectionFactory factory = new ConnectionFactory
{HostName = "localhost"
};// 连接
using IConnection connection = factory.CreateConnection();// 通道
using IModel channel = connection.CreateModel();channel.QueueDeclare(// 队列名称queue: "myqueue",// 持久化配置,队列是否能够在 broker 重启后存活durable: false,// 连接关闭时被删除该队列exclusive: false,// 当最后一个消费者(如果有的话)退订时,是否应该自动删除这个队列autoDelete: false,// 额外的参数配置arguments: null);

编写一个消费者,消费该队列中的消息,其完整代码如下:

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;ConnectionFactory factory = new ConnectionFactory
{HostName = "localhost"
};using IConnection connection = factory.CreateConnection();
using IModel channel = connection.CreateModel();channel.QueueDeclare(// 队列名称queue: "myqueue",// 持久化配置,队列是否能够在 broker 重启后存活durable: false,// 连接关闭时被删除该队列exclusive: false,// 当最后一个消费者(如果有的话)退订时,是否应该自动删除这个队列autoDelete: false,// 额外的参数配置arguments: null);// 定义消费者
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{var message = Encoding.UTF8.GetString(ea.Body.Span);Console.WriteLine($" [x] Received {message}");
};// 开始消费
channel.BasicConsume(queue: "myqueue",autoAck: true,consumer: consumer);Console.ReadLine();

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

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

相关文章

YOLOv5 分类模型 预处理 OpenCV实现

YOLOv5 分类模型 预处理 OpenCV实现 flyfish YOLOv5 分类模型 预处理 PIL 实现 YOLOv5 分类模型 OpenCV和PIL两者实现预处理的差异 YOLOv5 分类模型 数据集加载 1 样本处理 YOLOv5 分类模型 数据集加载 2 切片处理 YOLOv5 分类模型 数据集加载 3 自定义类别 YOLOv5 分类模型…

关于python 语音转字幕,字幕转语音大杂烩

文字转语音 Python语音合成之第三方库gTTs/pyttsx3/speech横评(内附使用方法)_python_脚本之家 代码示例 from gtts import gTTStts gTTS(你好你在哪儿!,langzh-CN)tts.save(hello.mp3)import pyttsx3engine pyttsx3.init() #创建对象"""语速"…

目前比较好用的护眼台灯,小学生适合的护眼台灯推荐

随着技术的发展,灯光早已成为每家每户都需要的东西。但是灯光不好可能会对眼睛造成伤害是很多人没有注意到的。现在随着护眼灯产品越来越多,市场上台灯的选择越来越多样化,如何选择一个对眼睛无伤害、无辐射的台灯成为许多家长首先要考虑的问…

【C++初阶】四、类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载函数)

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【C初阶】三、类和对象 (面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针) -CSDN博客 引入:类的六个默认成员函数…

如何使用springboot服务端接口公网远程调试——实现HTTP服务监听

🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、Cpolar杂谈 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 二. 内网穿透2.1 安装…

ATA-2042高压放大器在细胞的剪切应力传感器研究中的应用

微流控技术是一种通过微小的通道和微型装置对流体进行精确操控和分析的技术。它是现代医学技术发展过程中的一种重要的生物医学工程技术,具有广泛的应用前景和重要性。它在高通量分析、个性化医疗、细胞筛选等方面有着巨大的潜力,Aigtek安泰电子今天就将…

HR8833 双通道H桥电机驱动芯片

HR8833为玩具、打印机和其它电机一T化应用提供一种双通道电机驱动方案。HR8833提供两种封装,一种是带有L露焊盘的TSSOP-16封装,能改进散热性能,且是无铅产品,引脚框采用100%无锡电镀。另一种封装为SOP16,不…

智驾芯片全矩阵「曝光」,这家企业的车载品牌正式官宣

随着汽车智能化加速,智能驾驶芯片格局逐渐清晰。 针对L0-L2,业内基本采用智能前视一体机方案;要实现高速NOA、城市NOA等更为高阶的智驾功能等,则基本采用域控制器方案。从前视一体机至域控,再逐步演进到舱驾一体、中央…

python基于DETR(DEtection TRansformer)开发构建钢铁产业产品智能自动化检测识别系统

在前文中我们基于经典的YOLOv5开发构建了钢铁产业产品智能自动化检测识别系统,这里本文的主要目的是想要实践应用DETR这一端到端的检测模型来开发构建钢铁产业产品智能自动化检测识别系统。 DETR (DEtection TRansformer) 是一种基于Transformer架构的端到端目标检…

【Django使用】10大章31模块md文档,第5篇:Django模板和数据库使用

当你考虑开发现代化、高效且可扩展的网站和Web应用时,Django是一个强大的选择。Django是一个流行的开源Python Web框架,它提供了一个坚实的基础,帮助开发者快速构建功能丰富且高度定制的Web应用 全套Django笔记直接地址: 请移步这…

外汇天眼:多名投资者账户被恶意清空,远离volofinance!

最近,外汇平台volofinance因有多名投资者投诉,“荣幸”成为外汇天眼黑平台榜单中的一员,那么volofinance到底做了什么导致投资者前来投诉曝光呢? 起底volofinace 在网络搜索中,关于volofinance的信息少之又少&#xf…

成为AI产品经理——模型评估指标

目录 一、模型评估分类 1.在线评估 2.离线评估 二、离线模型评估 1.特征评估 ① 特征自身稳定性 ② 特征来源稳定性 ③ 特征成本 2.模型评估 ① 统计性评估 覆盖度 最大值、最小值 分布形态 ② 模型性能指标 分类问题 回归问题 ③ 模型的稳定性 模型评估指标分…

配置mvn打包参数,不同环境使用不同的配置文件

方法一: 首先在/resource目录下创建各自环境的配置 要在不同的环境中使用不同的配置文件进行Maven打包,可以使用Maven的profiles特性和资源过滤功能。下面是配置Maven打包参数的步骤: 在项目的pom.xml文件中,添加profiles配置…

第一个Mybatis项目

(一)为什么要用Mybatis? (1)Mybatis对比JDBC而言,sql(单独写在xml的配置文件中)和java编码分开,功能边界清晰,一个专注业务,一个专注数据。 (2&…

【C++】:多态

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关多态的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结…

Linux(CentOS7)上安装mysql

在CentOS中默认安装有MariaDB(MySQL的一个分支),可先移除/卸载MariaDB。 yum remove mariadb // 查看是否存在mariadb rpm -qa|grep -i mariadb // 卸载 mariadb rpm -e --nodeps rpm -qa|grep mariadb yum安装 下载rpm // 5.6版本 wge…

XML映射文件

<?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"org.mybatis.example.BlogMapper&q…

conan 入门(三十二):package_info中配置禁用CMakeDeps生成使用项目自己生成的config.cmake

conanfile.py中定义的package_info()方法用于向package的调用者(conumer)提供包库名&#xff0c;编译/连接选项&#xff0c;文件夹等等信息&#xff0c;有了这些信息构建工具的generator就可以根据它们生成对应的文件&#xff0c;用于调用者引用package. 比如基于cmake的CMakeD…

安全地公网访问树莓派等设备的服务 内网穿透--frp 23年11月方法

如果想要树莓派可以被公网访问&#xff0c;可以选择直接网上搜内网穿透提供商&#xff0c;一个月大概10块钱&#xff0c;也有免费的&#xff0c;但是免费的速度就不要希望很好了。 也可以选择接下来介绍的frp&#xff0c;这种方式不需要付费&#xff0c;但是需要你有一台有着公…

vue3自定义拖拽指令

<template><div v-move class"box"></div> </template><script setup lang"ts"> import { Directive } from vue const vMove:Directive (el:HTMLElement) >{const mousedown (e:MouseEvent) >{// 鼠标按下const s…