Net使用EasyNetQ简化与RabbitMQ的交互

EasyNetQ是一个为.NET环境设计的RabbitMQ客户端API,旨在简化与RabbitMQ的交互。

关于RabbitMq的更多知识点在:https://www.dotnetshare.com

公众号:Net分享,欢迎关注

安装EasyNetQ

你可以通过NuGet包管理器来安装EasyNetQ。在Package Manager Console中运行以下命令:

PM> Install-Package EasyNetQ

这将同时安装EasyNetQ和其依赖的RabbitMQ.Client库。 建议使用DI安装,EasyNetQ.DI.Microsof包含EasyNetQ,同时依赖Newtonsoft.Json

注册连接RabbitMQ
var connectionString = "host=111.111.11.111;virtualHost=/;username=admin;password=123456;timeout=60";
//链接注册
builder.Services.RegisterEasyNetQ("host=8.153.70.182;virtualHost=/;username=zhaoke;password=123123;publisherConfirms=true");
//发布注册
builder.Services.AddTransient();
//订阅注册
builder.Services.AddTransient();
//添加消息处理
builder.Services.AddHostedService();
发布消息
EasyNetQ支持发布/订阅模式,你可以通过创建一个.NET类来定义消息,然后使用Publish方法发布消息。例如:

public class TextMessage

{

public string Text { get; set; }

}

bus.Publish(new TextMessage { Text = "Hello World" });

EasyNetQ会根据消息类型自动创建交换机和队列,并使用Newtonsoft.Json序列化消息为JSON格式。

MQPublish的封装

using EasyNetQ.Topology;

using EasyNetQ;

///



/// 发布消息

///

public class MQPublish

{

private readonly IBus bus;

public MQPublish(IBus bus)
{
this.bus = bus;
}
/// <summary>
/// 发布消息
/// </summary>
/// <param name="routingKey"></param>
/// <param name="data"></param>
public async Task PublishMessageAsync(string routingKey, object data)
{
Console.WriteLine($"MQ消息推送,routingKey :{routingKey} , 推送数据 :{System.Text.Json.JsonSerializer.Serialize(data)}"); var message = new Message<object>(data);
var advancedBus = bus.Advanced;
advancedBus.QueueDeclare(routingKey);
await advancedBus.PublishAsync(Exchange.Default, routingKey, false, message);
} /// <summary>
/// 发布延迟消息
/// </summary>
/// <param name="routingKey"></param>
/// <param name="data"></param>
/// <param name="timeout">毫秒</param>
public void PublishDelayMessage(string routingKey, object data, int timeout)
{
var advancedBus = bus.Advanced;
var message = new Message<object>(data);
var properties = new MessageProperties();
properties.Headers.Add("x-delay", timeout);
var messageData = new Message<object>(message, properties);
// 建立延时 exchange
var exDelay = advancedBus.ExchangeDeclare($"{routingKey}_delay_exchange", cfg => cfg.AsDelayedExchange(ExchangeType.Direct));
// 申明队列
var qNormal = advancedBus.QueueDeclare($"{routingKey}_delay_queue");
// 绑定,设置好 RoutingKey
advancedBus.Bind(exDelay, qNormal, routingKey);
bus.Advanced.Publish(exDelay, routingKey, false, messageData);
}

}

订阅消息

订阅消息时,你需要指定一个订阅ID和一个处理消息的委托。例如:

bus.Subscribe("subscriptionId", message =>

{

Console.WriteLine("Received message: " + message.Text);

});

这样,当有消息发布到对应的交换机和队列时,你的订阅就会收到消息。

封装MQSubscribe

public class MQSubscribe

{

// MQ消息总线

private readonly IBus bus;

public MQSubscribe(IBus bus)

{

this.bus = bus;

}

/// <summary>
/// 处理消息的总入口
/// </summary>
/// <returns></returns>
public Task Init()
{
SubscribeTSysLogVis();
//程序不结束,等待输入
Console.WriteLine($"已启动(处理消息) {DateTime.UtcNow}"); return Task.CompletedTask;
} private Task SubscribeTSysLogVis()
{
var advancedBus = bus.Advanced;
//订阅TSysLogVis日志 - 请不要在两次发布之间重复使用它
var queue = advancedBus.QueueDeclare("TSysLogVis"); advancedBus.Consume(queue, async (body, properties, info) =>
{
try
{
var message = Encoding.UTF8.GetString(body.ToArray());
//var data = JsonConvert.DeserializeObject<TSysLogVis>(message);
Console.WriteLine($"消息处理 {DateTime.Now} : {message}");
//db.Insertable(data).SplitTable().ExecuteReturnSnowflakeId();
}
catch (Exception ex)
{
// 处理异常,例如记录日志或重新抛出
Console.Error.WriteLine($"处理消息时发生异常: {ex}");
}
});
return Task.CompletedTask;
}

}

SubscribeWorker

启用订阅服务即可

public class SubscribeWorker : BackgroundService
{
private readonly MQSubscribe _Service; public SubscribeWorker(MQSubscribe Service)
{
_Service = Service;
} // 执行逻辑
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await _Service.Init();
}
}

以上是EasyNetQ的基本使用方法,它还支持请求/响应模式和发送/接收模式,以及其他高级功能。你可以通过阅读官方文档来获取更多信息。

基础知识

• 消息队列(Message Queue):Rabbit 是基于消息队列的中间件,它允许应用程序通过发送和接收消息来进行异步通信。

• 生产者(Producer)和消费者(Consumer):Rabbit 中的应用程序可以充当生产者和消费者的角色。生产者负责将消息发送到队列中,消费者则从队列中接收并处理消息。

• 队列(Queue):Rabbit 使用队列来存储消息。生产者将消息发送到队列中,而消费者从队列中接收消息进行处理。队列可以确保消息的顺序性和可靠性。

• 交换器(Exchange):交换器负责接收生产者发送的消息,并根据一定的规则将消息路由到特定的队列中。Rabbit 提供了不同类型的交换器,如直连交换器(Direct Exchange)、主题交换器(Topic Exchange)等。

• 绑定(Binding):绑定将队列与交换器进行关联,定义了消息从交换器路由到队列的规则。一个队列可以绑定到多个交换器上,一个交换器也可以将消息路由到多个队列上。

• 路由键(Routing Key):生产者在发送消息时需要指定一个路由键,交换器根据路由键来判断将消息路由到哪些队列。不同类型的交换器对路由键的处理方式有所不同。

• 持久化(Durability):Rabbit 支持消息的持久化,即将消息存储到磁盘中以防止消息丢失。可以将队列、交换器和消息设置为持久化。

• 可靠性投递(Reliable Delivery):Rabbit 提供了消息可靠性投递的机制,确保消息能够被消费者正确地接收和处理。包括消息的确认机制、消息的重试、消息的死信队列等。

• 发布/订阅(Publish/Subscribe)模式:Rabbit 支持发布/订阅模式,其中一个生产者可以将消息同时发送给多个消费者,每个消费者都会收到相同的消息副本。

• ACK 机制:消费者收到消息后需要发送 ACK(确认)给 Rabbit 服务器,告知服务器消息已经被成功接收和处理,服务器可以将消息从队列中删除。

欢迎关注我的公众号“Net分享”,技术文章第一时间推送,随缘更新 , 分享一些你可能注意不到的细节。

Net使用EasyNetQ简化与RabbitMQ的交互的更多相关文章

  1. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

  2. 使用EasyNetQ简化RabbitMQ操作

    关于具体的操作看查看官方文档:https://github.com/EasyNetQ/EasyNetQ 也可以参考中文翻译版本:http://www.cnblogs.com/HuangLiang/p/ ...

  3. 【EasyNetQ】- 连接RabbitMQ

    如果您习惯于处理与SQL Server等关系数据库的连接,那么您可能会发现EasyNetQ处理连接的方式有点奇怪.与关系数据库的通信始终由客户端启动.客户端打开连接,发出SQL命令,在必要时处理结果, ...

  4. .net core集成使用EasyNetQ来使用rabbitmq

    之前有写到一篇介绍EasyNetQ的博文(C# .net 使用rabbitmq消息队列--EasyNetQ插件介绍),所以本文从.net core的角度去继承使用EasyNetQ,而用法类似于之前集成 ...

  5. .NET Core微服务之基于EasyNetQ使用RabbitMQ消息队列

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.消息队列与RabbitMQ 1.1 消息队列 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更 ...

  6. .NET操作RabbitMQ组件EasyNetQ使用中文简版文档。

    本文出自EasyNetQ官方文档,内容为自己理解加翻译.文档地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Quick-Start EasyNetQ简介 Ea ...

  7. 简单易用的.NET免费开源RabbitMQ操作组件EasyNetQ解析

    对于目前大多的.NET项目,其实使用的技术栈都是差不多,估计现在很少用控件开发项目的了,毕竟一大堆问题.对.NET的项目,目前比较适合的架构ASP.NET MVC,ASP.NET WebAPI,ORM ...

  8. NET操作RabbitMQ组件EasyNetQ

    NET操作RabbitMQ组件EasyNetQ使用中文简版文档. 本文出自EasyNetQ官方文档,内容为自己理解加翻译.文档地址:https://github.com/EasyNetQ/EasyNe ...

  9. EasyNetQ操作RabbitMQ(高级消息队列)

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件).写消息队列的时候用RabbitMQ比较好,但是写的时候需要自己封装下,自己的封装,就需要对RabbitM ...

  10. .NET 环境中使用RabbitMQ RabbitMQ与Redis队列对比 RabbitMQ入门与使用篇

    .NET 环境中使用RabbitMQ   在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的 ...

随机推荐

  1. 嵌入式Linux ubi文件系统制作、分区设置、只读文件系统,uboot启动参数root

    当前平台, 基于君正的X10000平台的嵌入式Linux 系统 0  目的 我要设置根文件系统为可读写, 设置data分区上的文件系统为只读 1 设置各文件系统的读写属性 /bin/mount -o ...

  2. Android Qcom USB Driver学习(零)

    该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) 文章标题 文章链接 文章简介 Android Qcom USB Driver学习(零) https://b ...

  3. 2022年最新数据库调查报告:超八成DBA月薪过万,你拖后腿了吗?

    数据库管理员属于IT行业高薪职业的一种,近几年关于数据库管理员的薪资统计文章也层出不穷,那么当前,DBA们的薪资究竟到达了怎样的水平呢? 墨天轮数据社区发布最新<2022年墨天轮数据库大调查报告 ...

  4. TX御加固脱壳

    示例APP某小说 其实脱这个有好几个方法,我使用了两个方法都可以脱掉. 首先使用Y佬的APK测试: 上传文件后经过等待提示任务成功,把给的ZIP包下载下来. 解压后得到两个文件,txt文件是脱壳后的a ...

  5. Nuxt.js 应用中的 restart 事件钩子详解

    title: Nuxt.js 应用中的 restart 事件钩子详解 date: 2024/10/14 updated: 2024/10/14 author: cmdragon excerpt: re ...

  6. 云原生周刊:Gateway API v1.1 发布 | 2024.6.3

    开源项目推荐 Grafana Tanka Tanka 是 Grafana 开发的一款用于 Kubernetes 的灵活.可重用和简洁的配置工具,是使用 YAML 进行 Kubernetes 配置的一种 ...

  7. 云原生周刊:CNCF 宣布 Falco 毕业|2024.3.4

    开源项目推荐 ldap-operator 用于部署和管理 LDAP 目录的 Kubernetes Operator. Updatecli Updatecli 是一个用于应用文件更新策略的工具.每个应用 ...

  8. 使用 KubeSphere 应用商店 5 分钟内快速部署 JuiceFS

    作者:朱唯唯,尹珉 JuiceFS 简介 JuiceFS 是为海量数据设计的分布式文件系统,使用对象存储来做数据持久化,避免重复造轮子,还能大大降低工程复杂度,让用户专注解决元数据和访问协议部分的难题 ...

  9. 云原生周刊:6 项 K8s 成本控制策略 | 2023.7.17

    开源项目推荐 Base Image Finder 当使用容器扫描工具来识别已知漏洞(CVE,或常见漏洞和暴露)时,可能很难理解漏洞在容器中的位置,以及如何缓解这些漏洞.通常,最简单.最有效的缓解方法是 ...

  10. 快速部署kafka集群和可视化界面

    3台机器部署kafka集群的分布 10.1.161.111 -> kafka(1个节点)+ zookeeper(一个节点)+ kowl(一个节点) 10.1.161.112 -> kafk ...