在 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 消息。希望对您有所帮助!

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

相关推荐
初次攀爬者5 小时前
RabbitMQ的消息模式和高级特性
后端·消息队列·rabbitmq
让我上个超影吧3 天前
消息队列——RabbitMQ(高级)
java·rabbitmq
塔中妖3 天前
Windows 安装 RabbitMQ 详细教程(含 Erlang 环境配置)
windows·rabbitmq·erlang
Ronin3053 天前
信道管理模块和异步线程模块
开发语言·c++·rabbitmq·异步线程·信道管理
小先生8124 天前
.NET Core后台任务队列
.net·.netcore
MoFe14 天前
【.net core】【watercloud】动态数据转换为静态表格,或者表格数据返回需要后处理
.netcore
2501_941800885 天前
云计算与边缘计算:协同合作助力智慧城市建设
rabbitmq
AlickLbc5 天前
RabbitMQ安装记录
分布式·rabbitmq
pursue.dreams5 天前
Windows 安装 RabbitMQ 保姆级教程
windows·rabbitmq
切糕师学AI6 天前
RabbitMQ 是什么?
微服务·消息队列·rabbitmq