前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Net使用EasyNetQ简化与RabbitMQ的交互

Net使用EasyNetQ简化与RabbitMQ的交互

作者头像
郑子铭
发布2025-01-10 10:55:39
发布2025-01-10 10:55:39
9000
代码可运行
举报
运行总次数:0
代码可运行

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

关于RabbitMq的更多知识点在:

https://www.dotnetshare.com

安装EasyNetQ

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

代码语言:javascript
代码运行次数:0
复制
PM> Install-Package EasyNetQ

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

代码语言:javascript
代码运行次数:0
复制
<PackageReference Include="EasyNetQ.DI.Microsoft" Version="7.8.0" /> 
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />

注册连接RabbitMQ

代码语言:javascript
代码运行次数:0
复制
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<MQPublish>();
//订阅注册
builder.Services.AddTransient<MQSubscribe>(); 
//添加消息处理
builder.Services.AddHostedService<SubscribeWorker>();

发布消息

EasyNetQ支持发布/订阅模式,你可以通过创建一个.NET类来定义消息,然后使用Publish方法发布消息。例如:

代码语言:javascript
代码运行次数:0
复制
public class TextMessage
{
    public string Text { get; set; }
}

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

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

MQPublish的封装
代码语言:javascript
代码运行次数:0
复制
using EasyNetQ.Topology;
using EasyNetQ;

/// <summary>
/// 发布消息
/// </summary>
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);
    }
}

订阅消息

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

代码语言:javascript
代码运行次数:0
复制
bus.Subscribe<TextMessage>("subscriptionId", message =>
{
    Console.WriteLine("Received message: " + message.Text);
});

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

封装MQSubscribe
代码语言:javascript
代码运行次数:0
复制
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

启用订阅服务即可

代码语言:javascript
代码运行次数:0
复制
    public classSubscribeWorker : BackgroundService
    {
        privatereadonly MQSubscribe _Service;

        public SubscribeWorker(MQSubscribe  Service)
        {
            _Service = Service;
        }

        // 执行逻辑
        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            await _Service.Init(); 
        }
    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装EasyNetQ
  • 注册连接RabbitMQ
  • 发布消息
    • MQPublish的封装
  • 订阅消息
    • 封装MQSubscribe
  • SubscribeWorker
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档