Skicka meddelanden med RabbitMQ
Det är enkelt att skriva kod som skapar köer, skickar meddelanden och tar emot meddelanden från RabbitMQ. I en .NET Aspire-lösning har du också hjälp med att skapa RabbitMQ-containern och upprätta anslutningar till den från mikrotjänster.
I din återförsäljare av utomhusutrustning har du bestämt dig för att implementera RabbitMQ som en central meddelandekö för din kundinriktade produktkatalogwebbplats. Du vill använda .NET Aspire RabbitMQ-integreringen för att hantera den här mäklaren och dess köer.
I den här lektionen får du lära dig hur du skapar en RabbitMQ-container och använder den för att skicka och ta emot meddelanden.
Använda .NET Aspire RabbitMQ-integreringen
När du använder RabbitMQ från .NET måste du vanligtvis skapa ett ConnectionFactory
objekt med en anslutningssträng och sedan använda det för att upprätta anslutningar till tjänsten. I ett .NET Aspire-projekt är det enklare att hantera RabbitMQ-anslutning eftersom:
- Du registrerar en anslutning och anslutningssträng i AppHost-projektet.
- När du skickar en referens till tjänsten till att använda projekt kan de använda beroendeinmatning för att få en anslutning till RabbitMQ. De behöver inte skapa och konfigurera sina egna anslutningar.
Konfigurera RabbitMQ i appvärden
I .NET Aspire måste du installera Rabbit MQ-värdintegrering i appvärden:
dotnet add package Aspire.Hosting.RabbitMQ
Nu kan du registrera RabbitMQ-tjänsten och skicka den till projekt som använder den:
// Service registration
var rabbit = builder.AddRabbitMQ("messaging");
// Service consumption
builder.AddProject<Projects.CatalogAPI>()
.WithReference(rabbit);
Hanterar AppHost
anslutningen för alla projekt i lösningen.
Konfigurera Rab
Lägg sedan till .NET Aspire RabbitMQ-integreringen i varje projekt som använder den:
dotnet add package Aspire.RabbitMQ.Client
Om du vill hämta en referens till RabbitMQ-meddelandekö anropar du AddRabbitMQClient()
metoden:
builder.AddRabbitMQClient("messaging");
Nu kan du använda beroendeinmatning för att hämta anslutningen till RabbitMQ:
public class CatalogAPI(IConnection rabbitConnection)
{
// Send and receive messages here
}
Med anslutningen är nästa steg att skapa en meddelandekanal, så här:
var channel = connection.CreateModel();
Skicka meddelanden
När du har meddelandekanalen kan du använda den för att konfigurera köer, utbyten och andra integreringar av din meddelandetopologi. Om du till exempel vill skapa en kö använder du den här koden:
channel.QueueDeclare(queue: "catalogEvents",
durable: false,
exclusive: false,
autoDelete: false,
arguments: null);
Du använder BasicPublish
metoden för att skicka ett meddelande till den här kön, men meddelandet förväntar sig att brödtexten är en bytematris:
var body = Encoding.UTF8.GetBytes("Getting all items in the catalog.");
channel.BasicPublish(exchange: string.Empty,
routingKey: "catalogEvents",
basicProperties: null,
body: body);
Ta emot meddelanden
I den mottagande integreringen skapar du meddelandekanalen och kön på samma sätt som för avsändaren. Kontrollera att könamnet matchar det du skapade i den sändande integreringen. Annars skapar du två separata köer och meddelanden kommer inte fram till rätt mål.
Du måste skapa en ny EventingBasicConsumer()
metod och registrera en metod för att hantera Received
händelsen:
var consumer = new EventingBasicConsumer(channel);
consumer.Received += ProcessMessageAsync;
Meddelandehanteraren använder ett BasicDeliverEventArgs
objekt för att hämta egenskaperna för meddelandet, inklusive meddelandetexten. Du måste komma ihåg att deserialisera meddelandetexten:
private void ProcessMessageAsync(object? sender, BasicDeliverEventArgs args)
{
string messagetext = Encoding.UTF8.GetString(args.Body.ToArray());
logger.LogInformation("The message is: {text}", messagetext);
}
Slutligen anropar du metoden för att kontrollera kön efter nya meddelanden BasicConsume()
.
channel.BasicConsume(queue: queueName,
autoAck: true,
consumer: consumer);