在构建分布式系统时,后台任务扮演着非常重要的角色。最常见的场景是消费服务总线的消息。在本文中,我将介绍如何在 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 消息。希望对您有所帮助!
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。




