Escrever código para enviar e receber mensagens usando uma fila

Concluído

Os aplicativos distribuídos usam filas do Service Bus como locais de armazenamento temporário para mensagens que estão aguardando entrega para um componente de destino. Para enviar e receber mensagens através de uma fila, você deve escrever código nos componentes de origem e destino.

Considere o aplicativo Contoso Bicycles. O cliente pode fazer um pedido através de um site ou aplicativo móvel. Como sites e aplicativos móveis são executados em dispositivos de clientes, não há limite para quantos pedidos podem ser feitos ao mesmo tempo. Ao fazer com que o aplicativo móvel e o site depositem os pedidos em uma fila do Service Bus, o componente back-end (um aplicativo Web) é capaz de processar pedidos dessa fila em seu próprio ritmo.

Na verdade, o aplicativo Contoso Bicycles tem várias etapas para lidar com um novo pedido. Todas as etapas dependem da primeira autorização de pagamento, então você decide usar uma fila. O primeiro trabalho do componente recetor é processar o pagamento.

Na aplicação móvel e no site, a Contoso tem de escrever código para adicionar uma mensagem à fila. No aplicativo Web back-end, a Contoso grava código que pega mensagens da fila.

Aqui, você examinará o processo e as considerações ao escrever código para enviar e receber mensagens usando uma fila do Service Bus.

Pacote NuGet Azure.Messaging.ServiceBus

Para facilitar a escrita de código que envia e recebe mensagens através do Service Bus, a Microsoft fornece uma biblioteca de classes .NET. Você pode usar em qualquer linguagem .NET para interagir com uma fila ou tópico do Service Bus. Você pode incluir essa biblioteca em seu aplicativo adicionando o pacote NuGet Azure.Messaging.ServiceBus.

Cadeias e chaves de ligação

Os componentes de origem e destino necessitam de duas informações para ligar a uma fila num espaço de nomes do Service Bus:

  • O local do namespace do Service Bus, também conhecido como ponto de extremidade: o local é especificado como um nome de domínio totalmente qualificado dentro do domínio servicebus.windows.net. Por exemplo: bicycleService.servicebus.windows.net.
  • Uma chave de acesso: o Service Bus restringe o acesso a filas ou tópicos exigindo uma chave de acesso válida.

Ambas as informações são fornecidas ao objeto ServiceBusClient na forma de uma cadeia de conexão. Você pode obter a cadeia de conexão correta para seu namespace no portal do Azure.

Chamar métodos de forma assíncrona

A fila no Azure pode estar localizada a milhares de quilômetros de distância do envio e recebimento de componentes. Mesmo que esteja fisicamente perto, conexões lentas e contenção de largura de banda podem causar atrasos quando um componente chama um método na fila. Por esse motivo, a biblioteca de cliente do Service Bus disponibiliza async métodos para interagir com filas. Vamos utilizar esses métodos para evitar o bloqueio de um thread ao aguardar pela conclusão das chamadas.

Quando você envia uma mensagem para uma fila, por exemplo, use o método SendMessageAsync com a await palavra-chave.

Para enviar uma mensagem para uma fila

Para enviar uma mensagem para uma fila, conclua as etapas a seguir.

Em qualquer componente de envio ou recebimento, adicione as instruções a seguir using a qualquer arquivo de código que chame uma fila do Service Bus.

using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;

Em seguida, crie um novo ServiceBusClient objeto e passe-lhe a cadeia de conexão e o nome da fila.

// Create a ServiceBusClient object using the connection string to the namespace.
await using var client = new ServiceBusClient(connectionString);
    
// Create a ServiceBusSender object by invoking the CreateSender method on the ServiceBusClient object, and specifying the queue name. 
ServiceBusSender sender = client.CreateSender(queueName);

Você pode enviar uma mensagem para a fila chamando o ServiceBusSender.SendMessageAsync() método e passando um ServiceBusMessagearquivo .

// Create a new message to send to the queue.
string messageContent = "Order new crankshaft for eBike.";
var message = new ServiceBusMessage(messageContent);

// Send the message to the queue.
await sender.SendMessageAsync(message);

Para receber mensagens de uma fila

Para receber mensagens, você deve primeiro registrar um manipulador de mensagens. O manipulador de mensagens é o método em seu código que é invocado quando uma mensagem está disponível na fila.

// Create a ServiceBusProcessor for the queue.
await using ServiceBusProcessor processor = client.CreateProcessor(queueName, options);
    
// Specify handler methods for messages and errors.
processor.ProcessMessageAsync += MessageHandler;
processor.ProcessErrorAsync += ErrorHandler;

Depois de concluir essa tarefa de processamento, Em seguida, dentro do manipulador de mensagens, chame o ProcessMessageEventArgs.CompleteMessageAsync() método para remover a mensagem da fila.

await args.CompleteMessageAsync(args.Message);