浅谈C# RabbitMQ

news2024/9/19 10:37:58

一、基本介绍

RabbitMQ——Rabbit Message Queue的简写,但不能仅仅理解其为消息队列,消息代理更合适。

RabbitMQ 是一个由 Erlang 语言开发的AMQP(高级消息队列协议)的开源实现,其内部结构如下:

RabbitMQ 内部结构

RabbitMQ作为一个消息代理,主要和消息打交道,负责接收并转发消息。

RabbitMQ提供了可靠的消息机制、跟踪机制和灵活的消息路由,支持消息集群和分布式部署。

适用于排队算法、秒杀活动、消息分发、异步处理、数据同步、处理耗时任务、CQRS等应用场景。

下面我们就来学习下RabbitMQ。

二、简单应用

在C#中使用RabbitMQ通常涉及到RabbitMQ.Client这个库,它是RabbitMQ的官方.NET客户端,允许开发者通过C#代码与RabbitMQ服务器进行交互。以下是一些基本的代码示例,展示了如何在C#应用程序中使用RabbitMQ。

1. 创建ConnectionFactory和Connection

using RabbitMQ.Client;
using RabbitMQ.Client.Events;

var factory = new ConnectionFactory() { HostName = "localhost" };
using(var connection = factory.CreateConnection())
{
    // 后续操作
}

2. 创建Channel

using(var channel = connection.CreateModel())
{
    // 使用channel进行队列声明、消息发布等操作
}

3. 声明队列

channel.QueueDeclare(queue: "myqueue",
                     durable: false, // 队列是否持久化
                     exclusive: false, // 是否排他
                     autoDelete: false, // 无消费者时是否自动删除
                     arguments: null);

4. 发布消息

string message = "Hello World!";
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchange: "",
                     routingKey: "myqueue", // 队列名作为路由键
                     basicProperties: null,
                     body: body);

5. 订阅消息

var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
    var body = ea.Body.ToArray();
    var receivedMessage = Encoding.UTF8.GetString(body);
    Console.WriteLine($"Received: {receivedMessage}");
    // 确认消息
    channel.BasicAck(ea.DeliveryTag, false);
};

channel.BasicConsume(queue: "myqueue",
                     autoAck: false,
                     consumer: consumer);

6. 消息确认

在消费者中,可以通过调用BasicAck方法来手动确认消息,告知RabbitMQ消息已被成功处理。

7. 异常处理

在使用RabbitMQ时,需要考虑异常处理机制,确保在出现网络问题或其他异常时,能够正确地关闭连接和通道。

8. 连接和通道的关闭

使用完连接和通道后,应该关闭它们以释放资源。

channel.Close();
connection.Close();

在实际应用中,可能还需要考虑更复杂的场景,比如消息的持久化、事务、发送方确认机制、消费者取消订阅等。以上代码提供了在C#中使用RabbitMQ的基本框架,可以根据具体需求进行扩展和优化。

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

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

相关文章

今年秋招太吓人了。(20届,在得物做Java开发)

有个学弟来问我诉苦最近好忙好累,说竞争压力特别大,让我给点建议,要不要放弃实习闷头搞秋招,我才意识到时间太快了,想想我都毕业几年了,感慨颇深,整理一下我的求职经验和目前的心得吧&#xff0…

SpingBoot集成kafka-发送读取消息示例

SpingBoot集成kafka开发 kafka的几个常见概念 1、springboot和kafka对应版本(重要)2、创建springboot项目,引入kafka依赖2.1、生产者EventProducer2.2、消费者EventConsumer2.3、启动生产者的方法SpringBoot01KafkaBaseApplication2.4、appli…

监控电脑屏幕的软件叫什么?6款电脑屏幕监控软件分享!

监控电脑屏幕的软件可以帮助企业和家长监控电脑的使用情况,确保工作和学习的效率与安全。 以下是六款常用的电脑屏幕监控软件及其特点: 1. Keylogger 特点:专注于企业数据安全和员工上网行为管理。 功能:全面的屏幕监控、上网…

Redis持久化(RDB、AOF、混合持久化)

目录 1、持久化机制 (1)RDB (2)AOF 2、混合持久化 3、总结 ❓为什么需要持久化? Redis 是一个基于内存的键值存储系统,它提供了非常快的数据访问速度,因为它不需要像传统的磁盘存储那样进…

竞猜足球核心算法源码

需要实现的功能如下: 仅用于学习 竞猜足球核心算法源码 package com.lotterysource.portsadmin.service; import com.aliyun.oss.common.utils.DateUtil; import com.fasterxml.jackson.core.type.TypeReference; import com.lotterysource.portsadmin.dbprovid…

进存销系统

摘 要 伴随着我国全面推动信息化的趋势,我国的很多行业都在朝着互联网的方向进发。商品销售行业也有很多挑战。这次论文介绍的进存销系统就是为了能够解决当前传统商品进存销存在的问题,使得商品进存销能够更加有效率。电商智能化管理必不可少的帮手有进…

功能安全实战系列02-RamTst(RamTest)开发介绍

本文框架 前言1. What(RamTst相关概念)1.1 后台检测1.2 前台检测1.3 RamTst对应状态机2.How?2.1 接口调用2.2 配置开发2.3 测试模式选择前言 在本系列笔者将结合工作中对功能安全实战部分的开发经验进一步介绍常用,包括Memory(Flash,Ram)失效检测,程序运行时序时间检测,及…

数字模拟IC设计前端、后端、前仿、后仿新版虚拟机

虚拟化平台:VMware Workstation 15 Pro以上版本 操作系统:CentOS Linux release 7.9.2009 (Core) 一、射频模拟IC设计必备软件 Cadence IC06.18.350/IC23.10.080(virtuoso) Cadence SPECTRE23.10.538-isr10 Cadence ASSURA04.…

Python优化算法15——麻雀搜索算法(SSA)

科研里面优化算法都用的多,尤其是各种动物园里面的智能仿生优化算法,但是目前都是MATLAB的代码多,python几乎没有什么包,这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考:Python优化算…

Mozilla为本地音频到文本翻译开发Whisperfile引擎

Mozilla Ocho 小组正进行 Mozilla 的"创新和实验"。Llamafile 用于将大型语言模型以单个文件的形式发布,以便在不同的硬件/软件间轻松执行。Whisperfile 是一项将音频轻松转化为文本的新引擎。 正如其名称所暗示的,Whisperfile 是围绕 OpenAI…

嵌入式UI开发-lvgl+wsl2+vscode系列:10、控件(Widgets)(三)

1、scale(标尺) 示例1 #include "../../lv_examples.h" #if LV_USE_SCALE && LV_BUILD_EXAMPLES/*** 简单的水平标尺*/ void lv_example_scale_1(void) {lv_obj_t * scale lv_scale_create(lv_screen_active());lv_obj_set_size(sca…

MyBatis源码(6)拦截器

1、目标 本文的主要目标是学习MyBatis拦截器的源码,本文将以插入操作为例debug拦截器相关的源码 2、拦截器源码分析 调用mapper接口的insert插入记录方法,会调用SqlSession对象的insert方法 SqlSession执行insert方法 Spring容器会创建SqlSessionTemp…

Python画笔案例-011 绘制草帽

1、绘制草帽 通过 python 的turtle 库绘制一个草帽的图案,如下图: 2、实现代码 绘制以上草帽的图案,代码如下: """草帽.py """ import turtle # 导入海龟模块turtle.delay(20) …

多动症的孩子有哪些症状表现?

在星启帆自闭症儿童康复机构,我们不仅关注自闭症儿童的成长与康复,也深刻认识到多动症对儿童日常生活、学习和社交的深远影响。多动症,全称注意缺陷多动障碍,是一种常见于儿童时期的神经发育性疾病,其症状表现多种多样…

Python优化算法16——鲸鱼优化算法(WOA)

科研里面优化算法都用的多,尤其是各种动物园里面的智能仿生优化算法,但是目前都是MATLAB的代码多,python几乎没有什么包,这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考:Python优化算…

ChatGPT不同模型在论文写作中的优势和应用

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 ChatGPT在论文写作中的应用日益广泛。作为OpenAI开发的先进语言模型,ChatGPT有多个版本,包括GPT-3.5、GPT-4.0和GPT-4.0-mini,每个版本在性能和应用方…

如何解决Docker启动时报Status: unknown flag: --graph问题

最近在进行Docker环境迁移时,用二制对Docker进行了重新安装,一切配置好之后,启动Docker时,服务启动不起来,使用journalctl -xe命令查看,报出以下错误: [rootapp docker]# journalctl -xe 8月 2…

【css】伪元素实现图片悬停文字聚焦效果

实现重点: 文字覆盖在图片上: 通过使用 position: absolute 将 .box 文字盒子定位在图片上方。父容器 .img-wrap 使用了 position: relative 确保子元素的绝对定位在父容器的边界内生效。 创建悬停效果: 通过使用 &::before 和 &::…

Android PopupWindow弹窗动态显示在View的上下方,

序、周末不加班, 效果图如下。 我们要弹出的PopupWindow在View的下方,如果下方区域不够,则弹出在上方。 实现方案思路 我们在显示的时候,首先去计算一下弹窗高度。使用屏幕的高 - popupwind的高并且和popup的高做对比&#xff0…

ASP.NET Core SignalR 构建高效实时通信应用

目录 前言 SignalR的基本概念及其工作原理 1、核心概念 2、工作原理 前端环境准备 1、安装SignalR 2、创建SignalR连接 3、设置自动重新连接 4、监听连接状态 5、初始化连接 后端环境准备 1、注册SignalR 2、设置Hub 3、配置路由 4、发送和接收消息 实现聊天应用…