2017-06-06 4 views
0

Je reçois OperationCanceledException lorsque j'envoie un message à une file d'attente de sujets (j'exécute mon code depuis une fonction Azure). La version que j'utilise est: "WindowsAzure.ServiceBus": "4.1.1" (le plus récent) et je reçois cette exception quand je fais le test de charge qui signifie que beaucoup de messages sont envoyés dans ce bus de service (qui contient plusieurs les sujets). On m'a dit d'utiliser un mécanisme de nouvelle tentative comme:OperationCanceledException lors de l'envoi au Service Bus

client.RetryPolicy = new RetryExponential(minBackoff: TimeSpan.FromSeconds(0.1), 
              maxBackoff: TimeSpan.FromSeconds(30), 
              maxRetryCount: 3); 

Mais je pensais que cela est déjà fait par défaut, non?

Conviendrait votre aide ici - Pourquoi ai-je cette exception et que puis-je faire pour résoudre ce problème?

Voici l'exception:

Exception System.OperationCanceledException: The operation cannot be performed because the entity has been closed or aborted. ---> System.ServiceModel.CommunicationObjectAbortedException: Internal Server Error: The server did not provide a meaningful reply; this might be caused by a premature session shutdown. TrackingId:88386cb1-a4e6-42e2-a8e1-bad3a2403329, Timestamp:6/6/2017 7:55:23 AM 
    at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Sbmp.DuplexRequestBindingElement.DuplexRequestSessionChannel.EndRequest(IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.RequestAsyncResult.<>c.<GetAsyncSteps>b__9_3(RequestAsyncResult thisPtr, IAsyncResult r) 
    at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result) 
--- End of stack trace from previous location where exception was thrown --- 
    at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.EndRequest(IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Sbmp.RedirectBindingElement.RedirectContainerChannelFactory`1.RedirectContainerSessionChannel.RequestAsyncResult.<>c__DisplayClass8_1.<GetAsyncSteps>b__4(RequestAsyncResult thisPtr, IAsyncResult r) 
    at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result) 
--- End of stack trace from previous location where exception was thrown --- 
    at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Sbmp.RedirectBindingElement.RedirectContainerChannelFactory`1.RedirectContainerSessionChannel.EndRequest(IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.RequestAsyncResult.<>c.<GetAsyncSteps>b__9_3(RequestAsyncResult thisPtr, IAsyncResult r) 
    at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result) 
--- End of stack trace from previous location where exception was thrown --- 
    at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Channels.ReconnectBindingElement.ReconnectChannelFactory`1.RequestSessionChannel.EndRequest(IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Sbmp.SbmpTransactionalAsyncResult`1.<>c.<GetAsyncSteps>b__18_3(TIteratorAsyncResult thisPtr, IAsyncResult a) 
    at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result) 
--- End of stack trace from previous location where exception was thrown --- 
    at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.EndSendCommand(IAsyncResult result) 
    --- End of inner exception stack trace --- 
    at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.EndSendCommand(IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.Sbmp.SbmpMessageSender.OnEndSend(IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.IteratorAsyncResult`1.StepCallback(IAsyncResult result) 
--- End of stack trace from previous location where exception was thrown --- 
    at Microsoft.ServiceBus.Common.AsyncResult.End[TAsyncResult](IAsyncResult result) 
    at Microsoft.ServiceBus.Messaging.MessageSender.OnSend(TrackingContext trackingContext, IEnumerable`1 messages, TimeSpan timeout) 
    at Microsoft.ServiceBus.Messaging.MessageSender.Send(TrackingContext trackingContext, IEnumerable`1 messages, TimeSpan timeout) 

Répondre

1

politique Retry est activée par le client par défaut ASB. Vous n'avez pas besoin de le faire vous-même.

Exception vous obtenez est OperationCanceledException et selon la documentation:

Retry will not help.

Ce qui est classé comme "erreur de codage de l'utilisateur". En regardant la trace de la pile d'exception, ce qui se passe envoyer pendant le fonctionnement et l'erreur est

Internal Server Error: The server did not provide a meaningful reply; this might be caused by a premature session shutdown. TrackingId:88386cb1-a4e6-42e2-a8e1-bad3a2403329...

Je suis tout à fait sûr que ce n'est pas erreur de code utilisateur, mais quelque chose qui a eu lieu du côté du courtier. Le TrackingId fourni avec l'erreur devrait vous permettre d'ouvrir un cas de support avec Microsoft pour au moins avoir une idée de ce qui s'est passé sur le courtier lorsque cette commande a échoué.

Modifier

Pendant ce temps, je suggère ce que pour mettre en œuvre votre opération une logique nouvelle tentative/backoff supplémentaire. Quelque chose qui ne réessayerait pas dans une boucle serrée et ne dépendrait pas du RetryPolicy du client.