0

J'ai un travail Web qui utilise le message Azure Service Bus Topic en enregistrant un rappel OnMessage. La durée de verrouillage de message a été définie à 30 secondes et la serrure renouveler le délai à 60 secondes. En tant que tels travaux prenant plus de 30 secondes pour traiter le message de bus de service obtiennent verrouillé expiré exception.Azure Service Bus Sujet Le verrou d'abonné a expiré l'exception

Maintenant, j'ai mis la durée de verrouillage de message à plus de verrouiller renouveler délai. Mais d'une manière ou d'une autre, il lance toujours la même exception. J'ai également redémarré mon webjob, mais toujours pas de chance.

J'ai essayé en cours d'exécution mêmes webjob messages consommateurs de sujet différent avec plus tard paramètres et il fonctionne très bien. Ce comportement est-il attendu, et après combien de temps ce changement de réglage reflète-t-il normalement?

Toute aide sera grande

Répondre

1

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.

+0

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 –

+0

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

+0

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. –

1

Les paramètres doivent se refléter presque immédiatement. Le renouvellement du verrou doit également être supérieur à la durée de verrouillage ou désactivé.

La fonction de renouvellement de verrouillage est une fonction client ASB qui ne remplace pas la durée de verrouillage définie sur les entités. Si vous pouvez reproduire ce problème et partager le repro, soulevez un problème de support avec Microsoft.