День 2338. #ЗаметкиНаПолях
RabbitMQ в .NET с Нуля. Продолжение
Начало
Получатель
Прослушивает очередь и обрабатывает сообщения по мере их поступления. Он должен:
- подключиться к RabbitMQ,
- подписаться на очередь,
- ожидать сообщений,
- десериализовывать и обрабатывать сообщения.
Рекомендуемый и наиболее удобный способ получения сообщений — настроить подписку с помощью интерфейса IAsyncBasicConsumer. Затем сообщения будут доставляться автоматически по мере их поступления. Один из способов реализации потребителя — использовать класс AsyncEventingBasicConsumer, в котором доставки и другие события жизненного цикла потребителя реализованы как события C#:
public class EmailConsumer : BackgroundService
{
private const string QUEUE =
"email-queue";
protected override async Task
ExecuteAsync(CancellationToken ct)
{
var fctry = new ConnectionFactory() {
HostName = "localhost" };
using var conn =
await fctry.CreateConnectionAsync(ct);
using var channel =
await conn.CreateChannelAsync(cancellationToken: ct);
await channel.QueueDeclareAsync(
queue: QUEUE,
durable: true,
exclusive: false,
autoDelete: false,
arguments: null,
cancellationToken: ct);
var consumer =
new AsyncEventingBasicConsumer(channel);
consumer.ReceivedAsync +=
async (sender, eventArgs) =>
{
var body = eventArgs.Body.ToArray();
var json = Encoding.UTF8.GetString(body);
var email =
JsonSerializer.Deserialize<Email>(json);
Console.WriteLine(
$"Email: {email?.To}, Тема: {email?.Subject}");
// Отправляем email…
Task.Delay(1000).Wait();
await ((AsyncEventingBasicConsumer)sender)
.Channel
.BasicAckAsync(
eventArgs.DeliveryTag,
multiple: false);
};
await channel.BasicConsumeAsync(
queue: QUEUE,
autoAck: true,
consumer: consumer,
cancellationToken: ct);
}
}
Окончание следует…
Источник: https://thecodeman.net/posts/rabbitmq-in-dotnet-from-scratch
>>Click here to continue<<