J'ai défini la durée de verrouillage des messages sur plus que le verrouillage du délai de renouvellement. Mais d'une manière ou d'une autre, il lance toujours la même exception.
La valeur maximale de la durée de verrouillage est de 5 min. Si vous avez besoin de moins de 5 min pour traiter le travail, vous pouvez augmenter la durée de verrouillage de votre message pour répondre à vos besoins.
Si vous avez besoin de plus de 5 minutes pour traiter votre travail, vous devez définir la propriété AutoRenewTimeout de OnMessageOptions. Il renouvellera le verrou si le verrou a expiré avant qu'il n'atteigne l'AutoRenewTimeout. Par exemple, si vous définissez la durée de verrouillage sur 1 min et définissez AutoRenewTimeout sur 5 min. Le message restera verrouillé pendant 5 minutes maximum si vous ne relâchez pas le verrou.
Voici l'exemple de code que j'ai utilisé pour tester la durée de verrouillage et AutoRenewTimeout de mon côté. Si le travail a passé plus de temps que la durée de verrouillage et AutoRenewTimeout, il lèvera une exception lorsque nous terminons le message (cela signifie que le délai d'expiration s'est produit). J'ai également modifié la durée de verrouillage sur le portail et la configuration sera appliquée immédiatement lorsque je reçois un message.
SubscriptionClient Client = SubscriptionClient.CreateFromConnectionString(connectionString, "topic name", "subscription name");
// Configure the callback options.
OnMessageOptions options = new OnMessageOptions();
options.AutoComplete = false;
options.AutoRenewTimeout = TimeSpan.FromSeconds(60);
Client.OnMessage((message) =>
{
try
{
//process the message here, I used following code to simulation a long time spent job
for (int i = 0; i < 30; i++)
{
Thread.Sleep(3000);
}
// Remove message from subscription.
message.Complete();
}
catch (Exception ex)
{
// Indicates a problem, unlock message in subscription.
message.Abandon();
}
}, options);
Pour votre question, s'il vous plaît vérifier combien de temps sera consacré à votre travail et choisissez une bonne façon de régler la durée de verrouillage et AutoRenewTimeout.
Le seul problème que j'ai avec 'OnMessageOptions.AutoRenewTimeout' est que ce n'est pas une opération garantie et la documentation ne l'indique pas. C'est une opération côté client, ce qui signifie qu'il peut échouer et verrouiller le renouvellement n'aura pas lieu. https: //weblogs.asp.net/sfeldman/azure-service-bus-autorenewtimeout –
Si vous souhaitez effectuer plus de contrôle sur l'action de renouvellement du verrou, vous pouvez appeler la méthode RenewLock mentionnée dans le blog. – Amor
Correct. C'est juste alors que vous perdez la commodité de l'API OnMessage. Quoi qu'il en soit, mon commentaire consistait simplement à mentionner que le recours à AutoRenewTimeout devrait être géré avec soin. Merci. –