在 ASP.NET Core 中使用(消费) RabbitMQ 消息

在构建分布式系统时,后台任务扮演着非常重要的角色。最常见的场景是消费服务总线的消息。在本文中,我将介绍如何在 ASP.NET Core 中通过 BackgroundService 消费 RabbitMQ 消息。

运行 RabbitMQ 主机

我们应该设置一个 RabbitMQ 实例。最快的方法是使用 Docker。

docker run -p 5672:5672 -p 15672:15672 rabbitmq:management

运行Docker容器后,我们可以通过http://localhost:15672查看管理页面。

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

示例代码:https://download.csdn.net/download/hefeng_aspnet/92057806

设置后台服务

在这里,我们创建一个名为 ConsumeRabbitMQHostedService 的新类,它继承自 BackgroundService。

BackgroundService 是用于实现长时间运行的 IHostedService 的基类。它提供了设置后台任务所需的主要工作。

下面是一个示例,演示如何使用 RabbitMQ 消息。

public class ConsumeRabbitMQHostedService : BackgroundService

{

private readonly ILogger _logger;

private IConnection _connection;

private IModel _channel;

public ConsumeRabbitMQHostedService(ILoggerFactory loggerFactory)

{

this._logger = loggerFactory.CreateLogger<ConsumeRabbitMQHostedService>();

InitRabbitMQ();

}

private void InitRabbitMQ()

{

var factory = new ConnectionFactory { HostName = "localhost" };

// create connection

_connection = factory.CreateConnection();

// create channel

_channel = _connection.CreateModel();

_channel.ExchangeDeclare("demo.exchange", ExchangeType.Topic);

_channel.QueueDeclare("demo.queue.log", false, false, false, null);

_channel.QueueBind("demo.queue.log", "demo.exchange", "demo.queue.*", null);

_channel.BasicQos(0, 1, false);

_connection.ConnectionShutdown += RabbitMQ_ConnectionShutdown;

}

protected override Task ExecuteAsync(CancellationToken stoppingToken)

{

stoppingToken.ThrowIfCancellationRequested();

var consumer = new EventingBasicConsumer(_channel);

consumer.Received += (ch, ea) =>

{

// received message

var content = System.Text.Encoding.UTF8.GetString(ea.Body);

// handle the received message

HandleMessage(content);

_channel.BasicAck(ea.DeliveryTag, false);

};

consumer.Shutdown += OnConsumerShutdown;

consumer.Registered += OnConsumerRegistered;

consumer.Unregistered += OnConsumerUnregistered;

consumer.ConsumerCancelled += OnConsumerConsumerCancelled;

_channel.BasicConsume("demo.queue.log", false, consumer);

return Task.CompletedTask;

}

private void HandleMessage(string content)

{

// we just print this message

_logger.LogInformation($"consumer received {content}");

}

private void OnConsumerConsumerCancelled(object sender, ConsumerEventArgs e) { }

private void OnConsumerUnregistered(object sender, ConsumerEventArgs e) { }

private void OnConsumerRegistered(object sender, ConsumerEventArgs e) { }

private void OnConsumerShutdown(object sender, ShutdownEventArgs e) { }

private void RabbitMQ_ConnectionShutdown(object sender, ShutdownEventArgs e) { }

public override void Dispose()

{

_channel.Close();

_connection.Close();

base.Dispose();

}

}

配置服务

我们应该使用ConfigureServices方法中的后台任务逻辑来配置这个托管服务。

public void ConfigureServices(IServiceCollection services)

{

// others ...

services.AddHostedService<ConsumeRabbitMQHostedService>();

}

结果

运行此应用程序后,我们可能会在终端中得到以下输出。

转到 RabbitMQ 的管理 UI,我们发现它创建了一个新的交换和一个新的队列。

下次我们尝试发布一条消息来显示后台任务运行良好时,我们会得到以下结果。

一切顺利!

概括

本文介绍了如何在 ASP.NET Core 中通过 BackgroundService 消费 RabbitMQ 消息。希望对您有所帮助!

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

相关推荐
宝桥南山2 小时前
.NET 11 - 尝试一下Minimal API中的异步验证新特性
microsoft·微软·c#·asp.net·.net·.netcore
叶总没有会7 小时前
MQ基础与使用背景
rabbitmq
墨神谕1 天前
RabbitMQ 从入门到实战:核心原理、消息模型、可靠性机制与 Spring Boot 实战
spring boot·rabbitmq·java-rabbitmq
做个文艺程序员1 天前
MQ第07篇:Java SaaS多租户消息隔离实战:RabbitMQ VHost+RocketMQ Tag+命名空间架构
spring boot·rabbitmq·rocketmq·saas·多租户
j7~1 天前
【仿 RabbitMQ 项目】发布订阅消息队列 (篇九):队列数据管理,内存镜像 + SQLite 持久化实现
数据库·c++·分布式·sqlite·rabbitmq·队列数据管理
此时不提桶,更待何时2 天前
06-23-A-RabbitMQ生态集成详解
分布式·rabbitmq
m0_646429972 天前
RabbitMQ 核心知识总结(生产实战版)
分布式·rabbitmq
此时不提桶,更待何时2 天前
06-24-B-RabbitMQ面试与生产事故实战
分布式·面试·rabbitmq
此时不提桶,更待何时3 天前
06-17-A-RabbitMQ架构与存储原理详解
rabbitmq
做个文艺程序员3 天前
MQ第03篇:RabbitMQ进阶实战:Topic路由+死信队列+延迟消息,SaaS订单超时取消完整方案
分布式·消息队列·rabbitmq·死信队列·延迟队列