Scrivere il codice per inviare e ricevere messaggi usando una coda
Le applicazioni distribuite usano code dei bus di servizio come posizioni di archiviazione temporanea per i messaggi in attesa di essere recapitati a un componente di destinazione. Per inviare e ricevere messaggi tramite una coda, è necessario scrivere codice nei componenti di origine e di destinazione.
Si consideri l'applicazione Contoso Bicycles. Il cliente può effettuare l'ordine tramite un sito Web o un'app per dispositivi mobili. Dal momento che vengono effettuati su dispositivi del cliente, non esiste alcun limite al numero di ordini che è possibile inviare contemporaneamente. Se l'app per dispositivi mobili e il sito Web depositano gli ordini in una coda del bus di servizio, il componente di back-end (un'app Web) può elaborare gli ordini da tale coda al proprio ritmo.
L'applicazione Contoso Bicycles attualmente prevede diversi passaggi per gestire un nuovo ordine. Tuttavia, per tutti i passaggi è prima richiesta l'autorizzazione del pagamento, di conseguenza si decide di usare una coda. Il primo processo del componente di ricezione consiste nell'elaborazione del pagamento.
Sia che si usi l'app per dispositivi mobili che il sito Web, Contoso deve scrivere il codice per aggiungere un messaggio alla coda. Nell'app Web di back-end Contoso scrive il codice che preleva i messaggi dalla coda.
In questo caso si esamineranno il processo e le considerazioni per scrivere codice per inviare e ricevere messaggi usando una coda di bus di servizio.
Pacchetto NuGet Azure.Messaging.ServiceBus
Per semplificare la scrittura di codice che invia e riceve i messaggi tramite il bus di servizio, Microsoft offre una libreria di classi .NET. È possibile usare in qualsiasi linguaggio .NET per interagire con una coda o un argomento del bus di servizio. È possibile includere questa libreria nell'applicazione aggiungendo il pacchetto NuGet Azure.Messaging.ServiceBus.
Stringhe di connessione e chiavi
I componenti di origine e di destinazione hanno entrambi bisogno di due elementi per connettersi a una coda in uno spazio dei nomi del bus di servizio:
- La posizione dello spazio dei nomi del bus di servizio, conosciuta anche come endpoint: La posizione viene specificata come nome di dominio completo all'interno del dominio servicebus.windows.net, Ad esempio: bicycleService.servicebus.windows.net.
- Una chiave di accesso: Il bus di servizio limita l'accesso a code, argomenti e inoltri richiedendo una chiave di accesso.
Entrambi questi elementi vengono specificati per l'oggetto ServiceBusClient sotto forma di stringa di connessione. È possibile ottenere la stringa di connessione corretta per lo spazio dei nomi dal portale di Azure.
Chiamare i metodi in modalità asincrona
La coda di Azure può trovarsi a migliaia di chilometri dai componenti di invio e ricezione. Anche se è fisicamente vicina, connessioni lente e la contesa della larghezza di banda possono causare ritardi quando un componente chiama un metodo sulla coda. Per questo motivo la libreria client del bus di servizio fa in modo che i metodi async
siano disponibili per l'interazione con le code. Si useranno questi metodi per evitare di bloccare un thread in attesa del completamento delle chiamate.
Quando si invia un messaggio a una coda, ad esempio, usare il metodo SendMessageAsync con la parola chiave await
.
Per inviare un messaggio a una coda
Per inviare un messaggio a una coda, completare i passaggi seguenti.
In qualsiasi componente di invio o di ricezione, aggiungere le istruzioni using
seguenti a qualsiasi file di codice che chiama una coda del bus di servizio.
using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;
Creare quindi un nuovo oggetto ServiceBusClient
e passarvi la stringa di connessione e il nome della coda.
// 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);
È possibile inviare un messaggio alla coda effettuando una chiamata al metodo ServiceBusSender.SendMessageAsync()
e passando a 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);
Per ricevere messaggi da una coda
Per ricevere messaggi, è prima necessario registrare un gestore di messaggi. Il gestore di messaggi rappresenta il metodo nel codice che viene invocato quando un messaggio è disponibile nella cosa.
// 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;
Eseguire l'elaborazione. Nel gestore di messaggi chiamare il metodo ProcessMessageEventArgs.CompleteMessageAsync()
per rimuovere il messaggio dalla coda.
await args.CompleteMessageAsync(args.Message);