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

Concluído

Os aplicativos distribuídos usam filas do Barramento de Serviço como locais de armazenamento temporário para mensagens que aguardam entrega para um componente de destino. Para enviar e receber mensagens por meio de uma fila, você precisa escrever o código nos componentes de origem e destino.

Considere o aplicativo da Contoso Bicycles. O cliente faz o pedido em um site ou aplicativo móvel. Como os sites e aplicativos móveis são executados nos dispositivos dos 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 Barramento de Serviço, o componente de back-end (um aplicativo Web) pode processar os pedidos dessa fila no próprio ritmo.

O aplicativo da Contoso Bicycles, na verdade, tem várias etapas de como gerenciar um novo pedido. Todas as etapas dependem da primeira autorização de pagamento, então você decide usar uma fila. A primeira tarefa do componente de recebimento é processar o pagamento.

No aplicativo móvel e no site, a Contoso precisa escrever o código que adicione uma mensagem à fila. No aplicativo Web de back-end, a Contoso escreve o código que seleciona as 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 Barramento de Serviço.

Pacote de NuGet Azure.Messaging.ServiceBus

Para facilitar a escrita do código que envia e recebe mensagens por meio do Barramento de Serviço, a Microsoft fornece uma biblioteca de classes .NET. É possível usar qualquer linguagem .NET para interagir com uma fila ou tópico do Barramento de Serviço. Você pode incluir essa biblioteca no aplicativo adicionando o pacote NuGet Azure.Messaging.ServiceBus.

Cadeias de conexão e chaves

Componentes de origem e de destino precisam de duas informações para conectarem-se a uma fila no namespace do Barramento de Serviço:

  • O local do namespace do Barramento de Serviço, também conhecido como ponto de extremidade: A localização é especificada como um nome de domínio totalmente qualificado no domínio servicebus.windows.net. Por exemplo: bicycleService.servicebus.windows.net.
  • Uma chave de acesso: O Barramento de Serviço restringe o acesso a filas ou tópicos exigindo uma chave de acesso válida.

Essas duas 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 o namespace no portal do Azure.

Chamar os métodos de modo assíncrono

A fila no Azure pode estar localizada a milhares de quilômetros de distância dos componentes de envio e recebimento. Mesmo que estejam fisicamente próximas, as conexões lentas e a contenção de largura de banda podem causar atrasos quando um componente chama um método na fila. Por esse motivo, a biblioteca de clientes do Barramento de Serviço disponibiliza os métodos async para interação com as filas. Vamos usar esses métodos para evitar o bloqueio de um thread enquanto aguarda a conclusão de chamadas.

Ao enviar uma mensagem para uma fila, por exemplo, use o método SendMessageAsync com a palavra-chave await.

Para enviar uma mensagem para uma fila

Para enviar uma mensagem para uma fila, conclua as seguintes etapas.

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

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

Em seguida, crie um objeto ServiceBusClient e passe a ele 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 à fila chamando o método ServiceBusSender.SendMessageAsync() e passando um ServiceBusMessage.

// 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;

Faça o trabalho de processamento. Em seguida, no manipulador de mensagens, chame o método ProcessMessageEventArgs.CompleteMessageAsync() para remover a mensagem da fila.

await args.CompleteMessageAsync(args.Message);