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

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

相关推荐
YDS8291 天前
大营销平台 —— 活动SKU库存扣减业务及其一致性处理
java·spring boot·redis·rabbitmq·ddd
霸道流氓气质1 天前
Kiro 中配置 RabbitMQ MCP Server 指南
分布式·rabbitmq·ruby
quweiie2 天前
tp8使用rabbitMQ消息队列的示例
消息队列·rabbitmq·thinkphp消息队列
六点_dn2 天前
RabbitMQ学习笔记-定义与作用
笔记·学习·rabbitmq
Steadfast_GG4 天前
RabbitMQ升级打怪之路(1) - RabbitMQ概述
消息队列·rabbitmq·流量削峰·消息分发·异步解耦
时代的狂5 天前
RabbitMQ 面试问答
分布式·面试·rabbitmq
半夜修仙5 天前
Spring集成邮箱功能
java·开发语言·spring boot·spring·rabbitmq·github·maven
半夜修仙7 天前
RabbitMQ的推模式和拉模式
java·分布式·中间件·rabbitmq·github·java-rabbitmq
952368 天前
RabbitMQ - 高级特性
java·spring boot·分布式·后端·rabbitmq
qiu_lovejun9989 天前
linux安装docker和redis和rabbitmq和nginx和rocketmq和kafka
linux·redis·docker·kafka·rabbitmq·rocketmq