Azure Service Bus, BrokeredMessage et opérations longues
05 Dec 2012 in Microsoft AzureLe service de messaging d’Azure Service Bus n’est à l’origine pas prévu pour exécuter des long-running process. Cependant le SDK 1.8 sorti en Octobre dernier apporte une petite nouveauté sur ce point. En effet, la classe BrokeredMessage offre désormais une méthode RenewLock
qui permet de demander le renouvèlement d’un verrou sur le brokered message afin qu’il ne soit pas remis à disposition dans la file d’attente.
Du coup, en se basant sur la propriété LockedUntilUtc, on peut réussir à exécuter une opération longue sans avoir de problème de perte de verrou sur le message :
//création d'un CTS pour lancer un task en charge de renouveller le verrou du message
var brokeredMessageRenewCancellationTokenSource = new CancellationTokenSource();
try
{
//reception du message
var brokeredMessage = _client.Receive();
var brokeredMessageRenew = Task.Factory.StartNew(() =>
{
while (!brokeredMessageRenewCancellationTokenSource.Token.IsCancellationRequested)
{
//on se base sur la propriété LockedUntilUtc pour savoir si le verrou expire bientôt
if (DateTime.UtcNow > brokeredMessage.LockedUntilUtc.AddSeconds(-10))
{
//si oui, on renouvelle le message
brokeredMessage.RenewLock();
}
Thread.Sleep(500);
}
}, brokeredMessageRenewCancellationTokenSource.Token);
//exécution d'une opération longue
RunLongRunningOperation();
//on marque le message comme terminé
brokeredMessage.Complete();
}
catch(MessageLockLostException)
{
//le verrou a expiré
}
catch(Exception)//autre exception
{
//autre erreur : on abandonne le message
brokeredMessage.Abandon();
}
finally
{
//on arrête la task de renouvellement du verrou
brokeredMessageRenewCancellationTokenSource.Cancel();
}
Et voilà !
Julien