Odesílání zpráv pomocí RabbitMQ
Je jednoduché napsat kód, který vytváří fronty, odesílá zprávy a přijímá zprávy z RabbitMQ. V řešení .NET Aspire také potřebujete pomoct vytvořit kontejner RabbitMQ a připojit se k němu z mikroslužeb.
Ve svém prodejci venkovních zařízení jste se rozhodli implementovat RabbitMQ jako centralizovaného zprostředkovatele zpráv pro web katalogu produktů určených pro zákazníky. Ke správě tohoto zprostředkovatele a jeho front chcete použít komponentu .NET Aspire RabbitMQ.
V této lekci se dozvíte, jak vytvořit kontejner RabbitMQ a jak ho použít k odesílání a přijímání zpráv.
Použití komponenty .NET Aspire RabbitMQ
Při použití RabbitMQ z .NET obvykle musíte vytvořit ConnectionFactory
objekt s připojovací řetězec a pak ho použít k vytvoření připojení ke službě. V projektu .NET Aspire je jednodušší spravovat připojení RabbitMQ, protože:
- V projektu AppHost zaregistrujete připojení a připojovací řetězec.
- Když službě předáte odkaz na využívání projektů, můžou pomocí injektáže závislostí získat připojení k RabbitMQ. Nepotřebují vytvářet a konfigurovat vlastní připojení.
Konfigurace RabbitMQ v hostiteli aplikace
V rozhraní .NET Aspire musíte nainstalovat komponentu hostování Rabbit MQ v hostiteli aplikace:
dotnet add package Aspire.Hosting.RabbitMQ
Nyní můžete zaregistrovat službu RabbitMQ a předat ji projektům, které ji používají:
// Service registration
var rabbit = builder.AddRabbitMQ("messaging");
// Service consumption
builder.AddProject<Projects.CatalogAPI>()
.WithReference(rabbit);
Spravuje AppHost
připojení pro všechny projekty v řešení.
Konfigurace Rabu
Dále přidejte komponentu .NET Aspire RabbitMQ do každého projektu, který ji používá:
dotnet add package Aspire.RabbitMQ.Client
Pokud chcete získat odkaz na zprostředkovatele zpráv RabbitMQ, zavolejte metodu AddRabbitMQClient()
:
builder.AddRabbitMQClient("messaging");
Teď můžete pomocí injektáže závislostí získat připojení k RabbitMQ:
public class CatalogAPI(IConnection rabbitConnection)
{
// Send and receive messages here
}
Dalším krokem při připojení je vytvoření kanálu pro zasílání zpráv, například takto:
var channel = connection.CreateModel();
Odesílání zpráv
Jakmile máte kanál pro zasílání zpráv, můžete ho použít k nastavení front, výměn a dalších součástí topologie zasílání zpráv. Například k vytvoření fronty použijte tento kód:
channel.QueueDeclare(queue: "catalogEvents",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
Metodu BasicPublish
použijete k odeslání zprávy do této fronty, ale zpráva očekává, že text bude pole bajtů:
var body = Encoding.UTF8.GetBytes("Getting all items in the catalog.");
channel.BasicPublish(exchange: string.Empty,
routingKey: "catalogEvents",
basicProperties: null,
body: body);
Příjem zpráv
V přijímající komponentě vytvoříte kanál pro zasílání zpráv a frontu stejným způsobem jako pro odesílatele. Ujistěte se, že název fronty odpovídá názvu fronty, který jste vytvořili v odesílající komponentě. V opačném případě vytvoříte dvě samostatné fronty a zprávy nedorazí do správného cíle.
Musíte vytvořit novou EventingBasicConsumer()
metodu a zaregistrovat metodu Received
pro zpracování události:
var consumer = new EventingBasicConsumer(channel);
consumer.Received += ProcessMessageAsync;
Obslužná rutina zprávy používá BasicDeliverEventArgs
objekt k získání vlastností zprávy, včetně textu zprávy. Je nutné pamatovat na deserializaci textu zprávy:
private void ProcessMessageAsync(object? sender, BasicDeliverEventArgs args)
{
string messagetext = Encoding.UTF8.GetString(args.Body.ToArray());
logger.LogInformation("The message is: {text}", messagetext);
}
Nakonec chcete-li zkontrolovat frontu pro nové zprávy, zavolejte metodu BasicConsume()
;
channel.BasicConsume(queue: queueName,
autoAck: true,
consumer: consumer);