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
Supporto nativo a JSON in SQL Server 2025
Gestione delle scrollbar dinamiche in HTML e CSS
Blazor e Static Web Assets in .NET 10
Interazione con ReconnectModal in Blazor
Le cron expression di un workflow di GitHub
Configuratione e utilizzo .NET Aspire CLI
Utilizzare AbortController per cancellare operazioni asincrone in JavaScript
Centralizzare gli endpoint AI Foundry con Azure API Management
Evitare memory leaks nelle closure JavaScript
Filtrare i dati in ASP.NET Core usando OpenTelemetry su Azure Monitor
Testare le API di Azure Resource Manager con API Playground
Creare un agente A2Acon Azure Logic Apps


