Quando un consumer smaltisce una Queue o una Subscription fornita da un namespace Service Bus, può ricevere messaggi che in alcune circostanze non vuole processare immediatamente (quindi rimuovere).
I motivi per cui il motore voglia aspettare il processamento possono essere molteplici: si aspetta messaggi in un certo ordine, ma non essendo garantito dalla coda questo non è successo, oppure vuole accumulare una serie di messaggi per poi combinare le informazioni tra di loro ed eseguire operazioni.
In questi casi viene in aiuto il metodo Defer della classe BrokeredMessage, il quale permette, se il lock sul messaggio è ancora valido, di tenere da parte il messaggio e di non renderlo più visibile, nonostante risieda sulla coda. E' compito poi del consumer tenere da parte il SequenceNumber, sempre diponsibile sul messaggio, per poterne poi farne richiesta con il metodo Receive.
Di seguito quindi un esempio che accumula tre messaggi, facendone il Defer, per poi andare a recuperarli.
// Creo il client della coda var client = messagingFactory.CreateQueueClient("myQueue"); List<long> numbers = new List<long>(); // Accumulo tre sequence number dei messaggi while (numbers.Count < 3) { // Ricevo il messaggio disponibile BrokeredMessage bm = client.Receive(); // Applico una condizione per decidere se farne il Defer o meno if (true) { numbers.Add(bm.SequenceNumber); bm.Defer(); } else { bm.Delete(); } } // Sfoglio tutti i sequence number messi da parte foreach (long n in numbers) { // Chiedo esplicitamente un messaggio BrokeredMessage bm = client.Receive(n); // Cancello il messaggio bm.Delete(); // Faccio qualcosa con il messaggio // ... }
Da notare come nella seconda parte del motore, al metodo Receive venga passato esplicitamente il sequence number dei messaggi di cui si è fatto il Defer.
Per ulteriori informazioni su Queue, i Topic e le Subscription si veda l'articolo
https://www.winfxitalia.com/articoli/windows-azure/sms-windows-phone-azure-queue.aspx
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Evitare (o ridurre) il repo-jacking sulle GitHub Actions
Autenticarsi in modo sicuro su Azure tramite GitHub Actions
Utilizzare Model as a Service su Microsoft Azure
Sfruttare al massimo i topic space di Event Grid MQTT
Routing statico e PreRendering in una Blazor Web App
Eseguire query verso tipi non mappati in Entity Framework Core
Filtrare e rimuovere gli elementi dalla cache del browser tramite le API JavaScript
Evitare la command injection in un workflow di GitHub
C# 12: Cosa c'è di nuovo e interessante
Migliora le tue soluzioni ASP.NET Core con Azure OpenAI
Utilizzare la libreria Benchmark.NET per misurare le performance
Utilizzare la session affinity con Azure Container Apps
I più letti di oggi
- Cambiare la chiave di partizionamento di Azure Cosmos DB
- ASP.NET 2.0 per tutti
- Definire stili a livello di libreria in Angular
- Utilizzare il trigger SQL con le Azure Function
- Ottimizzare le performance delle collection con le classi FrozenSet e FrozenDictionary
- .NET Conference Italia 2023 - Milano e Online
- Come EF 8 ha ottimizzato le query che usano il metodo Contains
- Ottimizzazione dei block template in Angular 17