Scrivere un codice per inviare e ricevere messaggi usando un argomento

Completato

In un'applicazione distribuita alcuni messaggi devono essere inviati a un singolo componente destinatario. Altri messaggi devono raggiungere più di una destinazione.

Si esaminerà ora cosa accade quando un utente annulla l'ordine di una biciletta. L'annullamento di un ordine è leggermente diverso dall'inserimento di un ordine iniziale. Quando si effettua un ordine, il flusso di lavoro attende l'elaborazione dell'operazione di pagamento prima di inviare l'ordine al negozio locale. Per l'operazione di annullamento, si invia una notifica al negozio locale e al gestore dei pagamenti contemporaneamente. Questo approccio riduce al minimo le probabilità di sprecare il tempo dell'addetto alla consegna.

Per consentire a più componenti di ricevere lo stesso messaggio, si userà un argomento del bus di servizio di Azure. Si esaminerà quindi il processo e le considerazioni in merito alla scrittura del codice.

Codice con argomenti e codice con code

Se si vuole che ogni messaggio inviato venga recapitato a tutti i componenti che hanno eseguito la sottoscrizione, è necessario usare gli argomenti. La scrittura di codice che usa gli argomenti rappresenta un modo per sostituire le code. Si userà lo stesso pacchetto NuGet Azure.Messaging.ServiceBus, si configureranno le stringhe di connessione e si useranno modelli di programmazione asincrona.

Si useranno anche le stesse classi ServiceBusClient e ServiceBusSender per inviare messaggi e la classe ServiceBusProcessor per riceverli.

Impostare i filtri nelle sottoscrizioni

Se si vuole che determinati messaggi inviati all'argomento vengano consegnati a una determinata sottoscrizione, è possibile inserire uno o più filtri nella sottoscrizione dell'argomento. Nell'applicazione per la biciletta, ad esempio, i negozi eseguono applicazioni in una piattaforma UWP (Universal Windows Platform). Ogni negozio può sottoscrivere l'argomento OrderCancellation e filtrare per il proprio StoreId. Ciò consente di risparmiare larghezza di banda Internet, in quanto non vengono inviati messaggi non necessari a più punti vendita. Allo stesso tempo, il componente di elaborazione dei pagamenti sottoscrive tutti i messaggi OrderCancellation.

I filtri possono essere di tre tipi:

  • Filtri booleani: TrueFilter garantisce che tutti i messaggi inviati all'argomento vengano recapitati alla sottoscrizione corrente. FalseFilter garantisce che nessuno dei messaggi vengano recapitati alla sottoscrizione corrente. (Questa scelta blocca o disattiva a tutti gli effetti la sottoscrizione.)
  • Filtri SQL: Un filtro SQL specifica una condizione usando la stessa sintassi di una clausola WHERE in una query SQL. Solo i messaggi che restituiscono True quando valutati rispetto a questo filtro vengono recapitati ai sottoscrittori.
  • Filtri di correlazione: Un filtro di correlazione contiene un set di condizioni che vengono confrontate con le proprietà di ogni messaggio. Si ha una corrispondenza quando la proprietà indicata nel filtro e la proprietà del messaggio hanno lo stesso valore.

Per il filtro StoreId, è possibile usare un filtro SQL. I filtri SQL sono più flessibili, ma al tempo stesso richiedono un maggiore utilizzo della memoria e possono ridurre la velocità effettiva del bus di servizio. In questo caso, è possibile scegliere un filtro di correlazione.

Per inviare un messaggio a un argomento

Per inviare un messaggio a un argomento, completare i passaggi seguenti.

In qualsiasi componente di invio o di ricezione, aggiungere le istruzioni using seguenti a qualsiasi file di codice che chiama un argomento del bus di servizio.

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

Per inviare un messaggio, creare prima un nuovo oggetto ServiceBusClient e passare la stringa di connessione e il nome dell'argomento.

await using var client = new ServiceBusClient(connectionString);

Creare quindi un oggetto ServiceBusSender richiamando il metodo CreateSender nell'oggetto ServiceBusClient e specificando il nome dell'argomento.

ServiceBusSender sender = client.CreateSender(topicName);

È possibile inviare un messaggio all'argomento effettuando una chiamata al metodo ServiceBusSender.SendMessageAsync() e passando a ServiceBusMessage. Così come avviene in una coda, il messaggio deve essere in formato di stringa con codifica UTF-8.

string message = "Cancel! I have changed my mind!";
var message = new ServiceBusMessage(message);

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

Per ricevere messaggi da una sottoscrizione

Per ricevere un messaggio da una sottoscrizione, è necessario creare un oggetto ServiceBusProcessor e passargli il nome dell'argomento e della sottoscrizione.

processor = client.CreateProcessor(topicName, subscriptionName, options);

Registrare quindi un gestore di messaggi e un gestore di errori.

// Specify the handler method for messages.
processor.ProcessMessageAsync += MessageHandler;

// Specify the handler method for errors.
processor.ProcessErrorAsync += ErrorHandler;

Eseguire l'elaborazione all'interno del gestore messaggi, quindi chiamare il metodo ProcessMessageEventArgs.CompleteMessageAsync() per rimuovere il messaggio dalla sottoscrizione.

// Complete the message. The message is deleted from the subscription. 
await args.CompleteMessageAsync(args.Message);