Service Bus messaging-uitzonderingen
In dit artikel worden de .NET-uitzonderingen vermeld die worden gegenereerd door .NET Framework API's.
Uitzonderingscategorieën
De bericht-API's genereren uitzonderingen die in de volgende categorieën kunnen vallen, samen met de bijbehorende actie die u kunt ondernemen om ze te herstellen. De betekenis en oorzaken van een uitzondering kunnen variëren, afhankelijk van het type berichtentiteit:
- Fout bij het coderen van de gebruiker (System.ArgumentException, System.InvalidOperationException, System.OperationCanceledException, System.Runtime.Serialization.SerializationException). Algemene actie: probeer de code te herstellen voordat u doorgaat.
- Setup/configuration error (Microsoft.ServiceBus.Messaging.MessagingEntityNotFoundException, System.UnauthorizedAccessException. Algemene actie: controleer uw configuratie en wijzig indien nodig.
- Tijdelijke uitzonderingen (Microsoft.ServiceBus.Messaging.MessagingException, Microsoft.ServiceBus.Messaging.ServerBusyException, Microsoft.ServiceBus.Messaging.MessagingCommunicationException). Algemene actie: de bewerking opnieuw uitvoeren of gebruikers op de hoogte stellen. De
RetryPolicyklasse in de client-SDK kan worden geconfigureerd voor het automatisch afhandelen van nieuwe proberen. Zie Richtlijnen voor opnieuw proberen voor meer informatie. - Andere uitzonderingen (System.Transactions.TransactionException, System.TimeoutException, Microsoft.ServiceBus.Messaging.MessageLockLostException, Microsoft.ServiceBus.Messaging.SessionLockLostException). Algemene actie: specifiek voor het uitzonderingstype; Raadpleeg de tabel in de volgende sectie:
Uitzonderingstypen
De volgende tabel bevat uitzonderingstypen voor berichten en de oorzaken, en opmerkingen bij voorgestelde actie die u kunt ondernemen.
| Uitzonderingstype | Beschrijving/oorzaak/voorbeelden | Voorgestelde actie | Opmerking bij automatisch/onmiddellijk opnieuw proberen |
|---|---|---|---|
| TimeoutException | De server heeft niet gereageerd op de aangevraagde bewerking binnen de opgegeven tijd, die wordt beheerd door OperationTimeout. De server heeft mogelijk de aangevraagde bewerking voltooid. Dit kan gebeuren vanwege vertragingen in het netwerk of andere infrastructuur. | Controleer de systeemtoestand op consistentie en ga zo nodig opnieuw proberen. Zie Time-outuitzonderingen. | In sommige gevallen kan een nieuwe poging helpen; logica voor opnieuw proberen toevoegen aan code. |
| InvalidOperationException | De aangevraagde gebruikersbewerking is niet toegestaan binnen de server of service. Zie het uitzonderingsbericht voor meer informatie. Met Complete() wordt bijvoorbeeld deze uitzondering gegenereerd als het bericht is ontvangen in de modus ReceiveAndDelete. | Controleer de code en de documentatie. Zorg ervoor dat de aangevraagde bewerking geldig is. | Opnieuw proberen helpt niet. |
| OperationCanceledException | Er wordt geprobeerd een bewerking aan te roepen voor een object dat al is gesloten, afgebroken of verwijderd. In zeldzame gevallen wordt de omgevingstransactie al verwijderd. | Controleer de code en zorg ervoor dat er geen bewerkingen worden aanroepen op een verwijderd object. | Opnieuw proberen helpt niet. |
| UnauthorizedAccessException | Het TokenProvider-object kan geen token verkrijgen, het token is ongeldig of het token bevat niet de claims die vereist zijn om de bewerking uit te voeren. | Zorg ervoor dat de tokenprovider met de juiste waarden is gemaakt. Controleer de configuratie van de Access Control Service. | In sommige gevallen kan een nieuwe poging helpen; logica voor opnieuw proberen toevoegen aan code. |
| ArgumentException ArgumentNullException ArgumentOutOfRangeException |
Een of meer argumenten die zijn opgegeven voor de methode zijn ongeldig. De URI die is opgegeven voor NamespaceManager of Create bevat padsegment(s). Het URI-schema dat is opgegeven voor NamespaceManager of Create is ongeldig. De waarde van de eigenschap is groter dan 32 KB. |
Controleer de aanroepcode en controleer of de argumenten juist zijn. | Opnieuw proberen helpt niet. |
| MessagingEntityNotFoundException | De entiteit die aan de bewerking is gekoppeld, bestaat niet of is verwijderd. | Zorg ervoor dat de entiteit bestaat. | Opnieuw proberen helpt niet. |
| MessageNotFoundException | Probeer een bericht met een bepaald volgnummer te ontvangen. Dit bericht is niet gevonden. | Zorg ervoor dat het bericht nog niet is ontvangen. Controleer de wachtrij voor deadletters om te zien of het bericht in een impasse is geplaatst. | Opnieuw proberen helpt niet. |
| MessagingCommunicationException | De client kan geen verbinding maken met Service Bus. | Zorg ervoor dat de opgegeven hostnaam juist is en of de host bereikbaar is. Als uw code wordt uitgevoerd in een omgeving met een firewall/proxy, moet u ervoor zorgen dat het verkeer naar het Service Bus-domein/IP-adres en de poorten niet wordt geblokkeerd. |
Opnieuw proberen kan helpen als er onregelmatige verbindingsproblemen zijn. |
| ServerBusyException | De service kan de aanvraag op dit moment niet verwerken. | De client kan een bepaalde tijd wachten en de bewerking vervolgens opnieuw uitvoeren. | De client kan het na een bepaald interval opnieuw proberen. Als een nieuwe poging resulteert in een andere uitzondering, controleert u het gedrag voor opnieuw proberen van die uitzondering. |
| MessagingException | Algemene berichten-uitzondering die in de volgende gevallen kan worden opgeworpen: Er wordt geprobeerd een QueueClient te maken met behulp van een naam of pad dat tot een ander entiteitstype behoort (bijvoorbeeld een onderwerp). Er wordt geprobeerd een bericht te verzenden dat groter is dan 256 kB. De server of service heeft een fout ondervonden tijdens het verwerken van de aanvraag. Zie het uitzonderingsbericht voor meer informatie. Dit is meestal een tijdelijke uitzondering.De aanvraag is beëindigd omdat de entiteit wordt beperkt. Foutcode: 50001, 50002, 50008. |
Controleer de code en zorg ervoor dat alleen serialiseerbare objecten worden gebruikt voor de bericht-body (of gebruik een aangepaste serializer). Raadpleeg de documentatie voor de ondersteunde waardetypen van de eigenschappen en gebruik alleen ondersteunde typen. Controleer de eigenschap IsTransient. Als dit waar is, kunt u de bewerking opnieuw proberen. |
Als de uitzondering wordt veroorzaakt door bandbreedtebeperking, wacht u een paar seconden en doet u het opnieuw. Gedrag voor opnieuw proberen is niet gedefinieerd en helpt mogelijk niet in andere scenario's. |
| MessagingEntityAlreadyExistsException | Probeer een entiteit te maken met een naam die al wordt gebruikt door een andere entiteit in die servicenaamruimte. | Verwijder de bestaande entiteit of kies een andere naam voor de entiteit die moet worden gemaakt. | Opnieuw proberen helpt niet. |
| QuotaExceededException | De berichtenentiteit heeft de maximaal toegestane grootte bereikt of het maximum aantal verbindingen met een naamruimte is overschreden. | Maak ruimte in de entiteit door berichten te ontvangen van de entiteit of de subqueues. Zie QuotaExceededException. | Een nieuwe poging kan helpen als berichten in de tussentijd zijn verwijderd. |
| RuleActionException | Service Bus retourneert deze uitzondering als u probeert een ongeldige regelactie te maken. Service Bus deze uitzondering aan een bericht met een impasse als er een fout optreedt tijdens het verwerken van de regelactie voor dat bericht. | Controleer de regelactie op juistheid. | Opnieuw proberen helpt niet. |
| FilterException | Service Bus retourneert deze uitzondering als u probeert een ongeldig filter te maken. Service Bus deze uitzondering aan een bericht met een impasse als er een fout is opgetreden tijdens het verwerken van het filter voor dat bericht. | Controleer het filter op juistheid. | Opnieuw proberen helpt niet. |
| SessionCannotBeLockedException | Probeer een sessie met een specifieke sessie-id te accepteren, maar de sessie is momenteel vergrendeld door een andere client. | Zorg ervoor dat de sessie is ontgrendeld door andere clients. | Opnieuw proberen kan helpen als de sessie is vrijgegeven in de tussentijd. |
| TransactionSizeExceededException | Te veel bewerkingen maken deel uit van de transactie. | Verminder het aantal bewerkingen dat deel uitmaakt van deze transactie. | Opnieuw proberen helpt niet. |
| MessagingEntityDisabledException | Aanvraag voor een runtime-bewerking op een uitgeschakelde entiteit. | Activeer de entiteit. | Een nieuwe poging kan helpen als de entiteit in de tussentijd is geactiveerd. |
| NoMatchingSubscriptionException | Service Bus retourneert deze uitzondering als u een bericht verzendt naar een onderwerp waarin vooraf filteren is ingeschakeld en geen van de filters overeenkomen. | Zorg ervoor dat ten minste één filter overeenkomt. | Opnieuw proberen helpt niet. |
| MessageSizeExceededException | De nettolading van een bericht overschrijdt de limiet van 256 kB. De limiet van 256 kB is de totale berichtgrootte, die systeemeigenschappen en eventuele .NET-overhead kan bevatten. | Verklein de grootte van de nettolading van het bericht en ga vervolgens opnieuw te werk. | Opnieuw proberen helpt niet. |
| TransactionException | De omgevingstransactie ( Transaction.Current ) is ongeldig. Deze is mogelijk voltooid of afgebroken. Interne uitzondering kan aanvullende informatie bieden. |
Opnieuw proberen helpt niet. | |
| TransactionInDoubtException | Er wordt een bewerking uitgevoerd op een transactie die twijfelt of er wordt een poging gedaan om de transactie door te voeren en de transactie wordt twijfelen. | Uw toepassing moet deze uitzondering afhandelen (als een speciaal geval), omdat de transactie mogelijk al is vastgelegd. | - |
QuotaExceededException
QuotaExceededException geeft aan dat een quotum voor een bepaalde entiteit is overschreden.
Wachtrijen en onderwerpen
Voor wachtrijen en onderwerpen is dit vaak de grootte van de wachtrij. De eigenschap van het foutbericht bevat meer informatie, zoals in het volgende voorbeeld:
Microsoft.ServiceBus.Messaging.QuotaExceededException
Message: The maximum entity size has been reached or exceeded for Topic: 'xxx-xxx-xxx'.
Size of entity in bytes:1073742326, Max entity size in bytes:
1073741824..TrackingId:xxxxxxxxxxxxxxxxxxxxxxxxxx, TimeStamp:3/15/2013 7:50:18 AM
Het bericht geeft aan dat het onderwerp de limiet voor de grootte heeft overschreden, in dit geval 1 GB (de standaardgroottelimiet).
Naamruimten
Voor naamruimten kan QuotaExceededException aangeven dat een toepassing het maximum aantal verbindingen met een naamruimte heeft overschreden. Bijvoorbeeld:
Microsoft.ServiceBus.Messaging.QuotaExceededException: ConnectionsQuotaExceeded for namespace xxx.
<tracking-id-guid>_G12 --->
System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]:
ConnectionsQuotaExceeded for namespace xxx.
Veelvoorkomende oorzaken
Er zijn twee veelvoorkomende oorzaken voor deze fout: de wachtrij voor onbesbare berichten en niet-werkende berichtontvangers.
Wachtrij voor in wachtrij voor in wachtrij geplaatste berichten Een lezer kan geen berichten voltooien en de berichten worden geretourneerd naar de wachtrij/het onderwerp wanneer de vergrendeling verloopt. Dit kan gebeuren als de lezer een uitzondering tegenkomt waardoor BrokeredMessage.Complete niet kan worden aanroepen. Nadat een bericht tien keer is gelezen, wordt het standaard verplaatst naar de wachtrij voor niet-lees berichten. Dit gedrag wordt bepaald door de eigenschap QueueDescription.MaxDeliveryCount en heeft een standaardwaarde van 10. Wanneer berichten in de wachtrij voor niet-geplaatste berichten staan, nemen ze ruimte in beslag.
Als u het probleem wilt oplossen, leest en voltooit u de berichten uit de wachtrij met in wachtrijen geplaatste berichten, net zoals u dat zou doen vanuit een andere wachtrij. U kunt de methode FormatDeadLetterPath gebruiken om het wachtrijpad voor onbesloede berichten op te maken.
Ontvanger is gestopt. Een ontvanger is gestopt met het ontvangen van berichten van een wachtrij of abonnement. U kunt dit identificeren door te kijken naar de eigenschap QueueDescription.MessageCountDetails, waarin de volledige uitsplitsing van de berichten wordt weergegeven. Als de eigenschap ActiveMessageCount hoog is of groeit, worden de berichten niet zo snel gelezen als ze worden geschreven.
TimeoutException
Een TimeoutException geeft aan dat een door de gebruiker geïnitieerde bewerking langer duurt dan de time-out van de bewerking.
Controleer de waarde van de eigenschap ServicePointManager.DefaultConnectionLimit, omdat het overschrijden van deze limiet ook een TimeoutException kan veroorzaken.
Er worden time-outs verwacht tijdens of tussen onderhoudsbewerkingen, zoals Service Bus service-updates (of) updates van het besturingssysteem op resources die de service uitvoeren. Tijdens updates van het besturingssysteem worden entiteiten verplaatst en worden knooppunten bijgewerkt of opnieuw opgestart, wat time-outs kan veroorzaken. Zie SLA voor service level agreement (SLA) voor de Azure Service Bus-service voor Service Bus.
Wachtrijen en onderwerpen
Voor wachtrijen en onderwerpen wordt de time-out opgegeven in de eigenschap MessagingFactorySettings.OperationTimeout, als onderdeel van de connection string of via ServiceBusConnectionStringBuilder. Het foutbericht zelf kan variëren, maar bevat altijd de time-outwaarde die is opgegeven voor de huidige bewerking.
MessageLockLostException
Oorzaak
De MessageLockLostException wordt weergegeven wanneer een bericht wordt ontvangen met behulp van de PeekLock Receive-modus en de vergrendeling die wordt vastgehouden door de client verloopt aan de servicezijde.
De vergrendeling van een bericht kan om verschillende redenen verlopen:
- De timer van de vergrendeling is verlopen voordat deze is vernieuwd door de clienttoepassing.
- De clienttoepassing heeft de vergrendeling verkregen, opgeslagen in een permanente opslag en vervolgens opnieuw opgestart. Nadat de clienttoepassing opnieuw is opgestart, heeft de inflight berichten bekeken en geprobeerd deze te voltooien.
Oplossing
In het geval van een MessageLockLostException kan de clienttoepassing het bericht niet meer verwerken. De clienttoepassing kan eventueel overwegen om de uitzondering te registreren voor analyse, maar de client moet het bericht verwijderen.
Omdat de vergrendeling van het bericht is verlopen, gaat het terug naar de wachtrij (of het abonnement) en kan het worden verwerkt door de volgende clienttoepassing die aanroepen ontvangen.
Als de MaxDeliveryCount is overschreden, kan het bericht worden verplaatst naar de DeadLetterQueue.
SessionLockLostException
Oorzaak
De SessionLockLostException wordt veroorzaakt wanneer een sessie wordt geaccepteerd en de vergrendeling van de client verloopt aan de servicezijde.
De vergrendeling van een sessie kan om verschillende redenen verlopen:
- De timer van de vergrendeling is verlopen voordat deze is vernieuwd door de clienttoepassing.
- De clienttoepassing heeft de vergrendeling verkregen, opgeslagen in een permanente opslag en vervolgens opnieuw opgestart. Nadat de clienttoepassing opnieuw is opgestart, heeft deze de eerste sessies bekeken en geprobeerd de berichten in die sessies te verwerken.
Oplossing
In het geval van een SessionLockLostException kan de clienttoepassing de berichten in de sessie niet meer verwerken. De clienttoepassing kan overwegen om de uitzondering te registreren voor analyse, maar de client moet het bericht verwijderen.
Omdat de vergrendeling van de sessie is verlopen, gaat deze terug naar de wachtrij (of het abonnement) en kan deze worden vergrendeld door de volgende clienttoepassing die de sessie accepteert. Omdat de sessievergrendeling op een bepaald moment wordt opgehouden door één clienttoepassing, wordt de verwerking op volgorde gegarandeerd.
SocketException
Oorzaak
In de volgende gevallen wordt er een SocketException opgeworpen:
- Wanneer een verbindingspoging mislukt omdat de host niet goed heeft gereageerd na een opgegeven tijd (TCP-foutcode 10060).
- Een tot stand gebrachte verbinding is mislukt omdat de verbonden host niet heeft gereageerd.
- Er is een fout opgetreden bij het verwerken van het bericht of de time-out is overschreden door de externe host.
- Onderliggend probleem met netwerkresource.
Oplossing
De SocketException-fouten geven aan dat de VM die als host voor de toepassingen wordt gebruikt, de naam niet kan converteren <mynamespace>.servicebus.windows.net naar het bijbehorende IP-adres.
Controleer of de onderstaande opdracht de toewijzing aan een IP-adres slaagt.
PS C:\> nslookup <mynamespace>.servicebus.windows.net
die een uitvoer moet bieden zoals hieronder
Name: <cloudappinstance>.cloudapp.net
Address: XX.XX.XXX.240
Aliases: <mynamespace>.servicebus.windows.net
Als de bovenstaande naam niet wordt opgelost naar een IP-adres en de alias van de naamruimte, controleert u welke netwerkbeheerder dit verder moet onderzoeken. Naamoplossing wordt uitgevoerd via een DNS-server, meestal een resource in het klantnetwerk. Als de DNS-resolutie wordt uitgevoerd door Azure DNS kunt u contact opnemen met ondersteuning voor Azure.
Als naamresolutie werkt zoals verwacht, controleert u of verbindingen met Azure Service Bus hier zijn toegestaan
MessagingException
Oorzaak
MessagingException is een algemene uitzondering die om verschillende redenen kan worden opgeworpen. Enkele van de redenen worden hieronder vermeld.
- Er wordt geprobeerd een QueueClient te maken voor een onderwerp of een abonnement.
- De grootte van het verzonden bericht is groter dan de limiet voor de opgegeven laag. Lees meer over de Service Bus quota en limieten.
- Een specifieke aanvraag voor de gegevenslaag (verzenden, ontvangen, voltooien, verlaten) is beëindigd vanwege een beperking.
- Tijdelijke problemen die worden veroorzaakt door service-upgrades en opnieuw opstarten.
Notitie
De bovenstaande lijst met uitzonderingen is niet volledig.
Oplossing
De oplossingsstappen zijn afhankelijk van de oorzaak van de MessagingException.
- Voor tijdelijke problemen (waarbij isTransient _ is ingesteld op _true_) of voor problemen met _ beperking, kan het probleem worden opgelost door de bewerking opnieuw uit te voeren. Het standaardbeleid voor opnieuw proberen voor de SDK kan hiervoor worden gebruikt.
- Voor andere problemen geven de details in de uitzondering aan dat het probleem en de oplossingsstappen op dezelfde manier kunnen worden afgeleid.
StorageQuotaExceededException
Oorzaak
StorageQuotaExceededException wordt gegenereerd wanneer de totale grootte van entiteiten in een Premium-naamruimte de limiet van 1 TB per berichteneenheid overschrijdt.
Oplossing
- Het aantal berichteneenheden verhogen dat is toegewezen aan de Premium-naamruimte
- Als u al maximaal toegestane berichteneenheden voor een naamruimte gebruikt, maakt u een afzonderlijke naamruimte.
Volgende stappen
Zie de Azure .NET API-Service Bus voor de volledige naslaginformatie over de .NET-API. Zie de gids voor probleemoplossing voor tips voor probleemoplossing