Undantag för Service Bus-meddelanden

I den här artikeln visas de .NET-undantag som genereras av .NET Framework-API:er.

Undantagskategorier

Meddelande-API:erna genererar undantag som kan ingå i följande kategorier, tillsammans med den associerade åtgärd som du kan vidta för att försöka åtgärda dem. Innebörden och orsakerna till ett undantag kan variera beroende på typen av meddelandeentitet:

  1. Användarkodningsfel (System.ArgumentException, System.InvalidOperationException, System.OperationCanceledException, System.Runtime.Serialization.SerializationException). Allmän åtgärd: försök att åtgärda koden innan du fortsätter.
  2. Installations-/konfigurationsfel (Microsoft. ServiceBus.Messaging.MessagingEntityNotFoundException, System.UnauthorizedAccessException. Allmän åtgärd: Granska konfigurationen och ändra vid behov.
  3. Tillfälliga undantag (Microsoft. ServiceBus.Messaging.MessagingException, Microsoft. ServiceBus.Messaging.ServerBusyException, Microsoft. ServiceBus.Messaging.MessagingCommunicationException). Allmän åtgärd: försök utföra åtgärden igen eller meddela användarna. Klassen RetryPolicy i klient-SDK:et kan konfigureras för att hantera återförsök automatiskt. Mer information finns i Vägledning för återförsök.
  4. Andra undantag (System.Transactions.TransactionException, System.TimeoutExceptionMicrosoft. ServiceBus.Messaging.MessageLockLostException, Microsoft. ServiceBus.Messaging.SessionLockLostException). Allmän åtgärd: specifik för undantagstypen; se tabellen i följande avsnitt:

Viktigt

Azure Service Bus försöker inte utföra en åtgärd igen i händelse av ett undantag när åtgärden finns i ett transaktionsomfång.

Undantagstyper

I följande tabell visas undantagstyper för meddelanden och deras orsaker samt förslag på åtgärder som du kan vidta.

Undantagstyp Beskrivning/orsak/exempel Föreslagen åtgärd Obs! Automatisk/omedelbart återförsök
TimeoutException Servern svarade inte på den begärda åtgärden inom den angivna tiden, vilket styrs av OperationTimeout. Servern kan ha slutfört den begärda åtgärden. Det kan inträffa på grund av nätverks- eller andra infrastrukturfördröjningar. Kontrollera systemtillståndet för konsekvens och försök igen om det behövs. Se Timeout-undantag. Försök igen kan hjälpa i vissa fall. lägg till logik för återförsök i koden.
InvalidOperationException Den begärda användaråtgärden tillåts inte på servern eller tjänsten. Mer information finns i undantagsmeddelandet. Till exempel genererar Complete() det här undantaget om meddelandet togs emot i läget ReceiveAndDelete . Kontrollera koden och dokumentationen. Kontrollera att den begärda åtgärden är giltig. Det hjälper inte att försöka igen.
OperationCanceledException Ett försök görs att anropa en åtgärd på ett objekt som redan har stängts, avbrutits eller tagits bort. I sällsynta fall har den omgivande transaktionen redan tagits bort. Kontrollera koden och se till att den inte anropar åtgärder på ett borttaget objekt. Det hjälper inte att försöka igen.
UnauthorizedAccessException TokenProvider-objektet kunde inte hämta en token, token är ogiltig eller så innehåller token inte de anspråk som krävs för att utföra åtgärden. Kontrollera att tokenprovidern har skapats med rätt värden. Kontrollera konfigurationen av 存取控制-tjänsten. Försök igen kan hjälpa i vissa fall. lägg till logik för återförsök i koden.
ArgumentException
ArgumentNullException
ArgumentOutOfRangeException
Ett eller flera argument som angetts för metoden är ogiltiga.
Den URI som angetts för NamespaceManager eller Create innehåller sökvägssegment.
Det URI-schema som angetts för NamespaceManager eller Create är ogiltigt.
Egenskapsvärdet är större än 32 kB.
Kontrollera den anropande koden och kontrollera att argumenten är korrekta. Det hjälper inte att försöka igen.
MessagingEntityNotFoundException Entiteten som är associerad med åtgärden finns inte eller så har den tagits bort. Kontrollera att entiteten finns. Det hjälper inte att försöka igen.
MessageNotFoundException Försök att ta emot ett meddelande med ett visst sekvensnummer. Det här meddelandet hittades inte. Kontrollera att meddelandet inte redan har tagits emot. Kontrollera deadletter-kön för att se om meddelandet har deadlettered. Det hjälper inte att försöka igen.
MessagingCommunicationException Klienten kan inte upprätta en anslutning till Service Bus. Kontrollera att det angivna värdnamnet är korrekt och att värden kan nås.

Om koden körs i en miljö med en brandvägg/proxy kontrollerar du att trafiken till Service Bus-domänen/IP-adressen och portarna inte blockeras.

Försök igen kan vara till hjälp om det uppstår tillfälliga anslutningsproblem.
ServerBusyException Tjänsten kan inte bearbeta begäran just nu. Klienten kan vänta en viss tid och sedan försöka utföra åtgärden igen. Klienten kan försöka igen efter ett visst intervall. Om ett nytt försök resulterar i ett annat undantag kontrollerar du återförsöksbeteendet för undantaget.
MessagingException Allmänt meddelandefel som kan genereras i följande fall:

Ett försök görs att skapa en QueueClient med ett namn eller en sökväg som tillhör en annan entitetstyp (till exempel ett ämne).

Ett försök görs att skicka ett meddelande som är större än 256 KB.

Servern eller tjänsten påträffade ett fel under bearbetningen av begäran. Mer information finns i undantagsmeddelandet. Det är vanligtvis ett tillfälligt undantag.

Begäran avbröts eftersom entiteten begränsas. Felkod: 50001, 50002, 50008.

Kontrollera koden och se till att endast serialiserbara objekt används för meddelandetexten (eller använd en anpassad serialiserare).

I dokumentationen finns de värdetyper som stöds för egenskaperna och använd endast typer som stöds.

Kontrollera egenskapen IsTransient . Om det är sant kan du försöka utföra åtgärden igen.

Om undantaget beror på begränsning väntar du några sekunder och försöker igen. Återförsöksbeteendet är odefinierat och kanske inte hjälper i andra scenarier.
MessagingEntityAlreadyExistsException Försök att skapa en entitet med ett namn som redan används av en annan entitet i tjänstnamnområdet. Ta bort den befintliga entiteten eller välj ett annat namn för den entitet som ska skapas. Det hjälper inte att försöka igen.
QuotaExceededException Meddelandeentiteten har nått sin maximala tillåtna storlek, eller så har det maximala antalet anslutningar till ett namnområde överskridits. Skapa utrymme i entiteten genom att ta emot meddelanden från entiteten eller dess underfrågor. Se QuotaExceededException. Försök igen kan vara till hjälp om meddelanden har tagits bort under tiden.
RuleActionException Service Bus returnerar det här undantaget om du försöker skapa en ogiltig regelåtgärd. Service Bus bifogar det här undantaget till ett meddelande som inte har slutförts om ett fel inträffar när regelåtgärden för det meddelandet bearbetas. Kontrollera att regelåtgärden är korrekt. Det hjälper inte att försöka igen.
FilterException Service Bus returnerar det här undantaget om du försöker skapa ett ogiltigt filter. Service Bus bifogar det här undantaget till ett deadlettered-meddelande om ett fel uppstod när filtret för meddelandet bearbetades. Kontrollera att filtret är korrekt. Det hjälper inte att försöka igen.
SessionCannotBeLockedException Försök att acceptera en session med ett specifikt sessions-ID, men sessionen är för närvarande låst av en annan klient. Kontrollera att sessionen är olåst av andra klienter. Försök igen kan vara till hjälp om sessionen har släppts under tiden.
TransactionSizeExceededException För många åtgärder ingår i transaktionen. Minska antalet åtgärder som ingår i den här transaktionen. Det hjälper inte att försöka igen.
MessagingEntityDisabledException Begäran om en körningsåtgärd på en inaktiverad entitet. Aktivera entiteten. Ett nytt försök kan vara till hjälp om entiteten har aktiverats under tiden.
NoMatchingSubscriptionException Service Bus returnerar det här undantaget om du skickar ett meddelande till ett ämne som har förfiltrering aktiverat och inget av filtren matchar. Kontrollera att minst ett filter matchar. Det hjälper inte att försöka igen.
MessageSizeExceededException En meddelandenyttolast överskrider gränsen på 256 KB. Gränsen på 256 KB är den totala meddelandestorleken, som kan innehålla systemegenskaper och eventuella .NET-omkostnader. Minska storleken på meddelandenyttolasten och försök sedan igen. Det hjälper inte att försöka igen.
TransactionException Den omgivande transaktionen (Transaction.Current) är ogiltig. Den kan ha slutförts eller avbrutits. Inre undantag kan ge ytterligare information. Det hjälper inte att försöka igen.
TransactionInDoubtException En åtgärd görs på en transaktion som är osäker, eller ett försök görs att genomföra transaktionen och transaktionen blir osäker. Ditt program måste hantera det här undantaget (som ett specialfall), eftersom transaktionen kanske redan har checkats in. -

QuotaExceededException

QuotaExceededException anger att en kvot för en specifik enhet har överskridits.

Köer och ämnen

För köer och ämnen är det ofta storleken på kön. Felmeddelandeegenskapen innehåller ytterligare information, som i följande exempel:

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

Meddelandet anger att ämnet överskred sin storleksgräns, i det här fallet 1 GB (standardstorleksgränsen).

Namnrymder

För namnområden kan QuotaExceededException indikera att ett program har överskridit det maximala antalet anslutningar till ett namnområde. Ett exempel:

Microsoft.ServiceBus.Messaging.QuotaExceededException: ConnectionsQuotaExceeded for namespace xxx.
<tracking-id-guid>_G12 ---> 
System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]: 
ConnectionsQuotaExceeded for namespace xxx.

Vanliga orsaker

Det finns två vanliga orsaker till det här felet: kön med obeställbara meddelanden och icke-fungerande meddelandemottagare.

  1. Kö med obeställbara meddelanden En läsare kan inte slutföra meddelanden och meddelandena returneras till kön/ämnet när låset upphör att gälla. Det kan inträffa om läsaren stöter på ett undantag som hindrar den från att anropa BrokeredMessage.Complete. När ett meddelande har lästs 10 gånger flyttas det till kön med obeställbara meddelanden som standard. Det här beteendet styrs av egenskapen QueueDescription.MaxDeliveryCount och har standardvärdet 10. När meddelanden staplas upp i kön för obeställbara meddelanden tar de upp utrymme.

    Lös problemet genom att läsa och slutföra meddelandena från kön med obeställbara meddelanden, precis som från andra köer. Du kan använda metoden FormatDeadLetterPath för att formatera kösökvägen med obeställbara meddelanden.

  2. Mottagaren har stoppats. En mottagare har slutat ta emot meddelanden från en kö eller prenumeration. Sättet att identifiera detta är att titta på egenskapen QueueDescription.MessageCountDetails , som visar den fullständiga uppdelningen av meddelandena. Om egenskapen ActiveMessageCount är hög eller växer, läss inte meddelandena lika snabbt som de skrivs.

TimeoutException

Ett TimeoutException indikerar att en åtgärd som användaren har initierat tar längre tid än åtgärdens tidsgräns.

Du bör kontrollera värdet för egenskapen ServicePointManager.DefaultConnectionLimit , eftersom om du når den här gränsen kan det också orsaka timeoutException.

Timeouter förväntas uppstå under eller mellan olika underhållsåtgärder, till exempel tjänstuppdateringar i Service Bus (eller) operativsystemuppdateringar på resurser som kör tjänsten. Under operativsystemuppdateringar flyttas entiteter runt och noder uppdateras eller startas om, vilket kan orsaka timeouter. Information om serviceavtal (SLA) för Azure Service Bus-tjänsten finns i SLA för Service Bus.

Köer och ämnen

För köer och ämnen anges tidsgränsen antingen i egenskapen MessagingFactorySettings.OperationTimeout som en del av συμβολοσειρά σύνδεσης eller via ServiceBusConnectionStringBuilder. Själva felmeddelandet kan variera, men det innehåller alltid det tidsgränsvärde som angetts för den aktuella åtgärden.

MessageLockLostException

Orsak

MessageLockLostException genereras när ett meddelande tas emot med peeklock-mottagningsläget och låset som innehas av klienten upphör att gälla på tjänstsidan.

Låset på ett meddelande kan upphöra att gälla på grund av olika orsaker:

  • Låstimern har upphört att gälla innan den förnyades av klientprogrammet.
  • Klientprogrammet hämtade låset, sparade det i ett beständigt arkiv och startade sedan om det. När den startades om tittade klientprogrammet på inflight-meddelandena och försökte slutföra dessa.

Lösning

I händelse av en MessageLockLostException kan klientprogrammet inte längre bearbeta meddelandet. Klientprogrammet kan också överväga att logga undantaget för analys, men klienten måste ta bort meddelandet.

Eftersom låset på meddelandet har upphört att gälla går det tillbaka till kön (eller prenumerationen) och kan bearbetas av nästa klientprogram som anropar mottagningen.

Om MaxDeliveryCount har överskridits kan meddelandet flyttas till DeadLetterQueue.

SessionLockLostException

Orsak

SessionLockLostException genereras när en session accepteras och låset som innehas av klienten upphör att gälla på tjänstsidan.

Låset på en session kan upphöra att gälla på grund av olika orsaker:

  • Låstimern har upphört att gälla innan den förnyades av klientprogrammet.
  • Klientprogrammet hämtade låset, sparade det i ett beständigt arkiv och startade sedan om det. När den startades om tittade klientprogrammet på inflight-sessionerna och försökte bearbeta meddelandena i dessa sessioner.

Lösning

I händelse av en SessionLockLostException kan klientprogrammet inte längre bearbeta meddelandena i sessionen. Klientprogrammet kan överväga att logga undantaget för analys, men klienten måste ta bort meddelandet.

Eftersom låset på sessionen har upphört att gälla går det tillbaka till kön (eller prenumerationen) och kan låsas av nästa klientprogram som accepterar sessionen. Eftersom sessionslåset hålls av ett enda klientprogram vid en viss tidpunkt garanteras bearbetningen i ordning.

SocketException

Orsak

En SocketException genereras i följande fall:

  • När ett anslutningsförsök misslyckas eftersom värden inte svarade korrekt efter en angiven tid (TCP-felkod 10060).
  • En upprättad anslutning misslyckades eftersom den anslutna värden inte svarade.
  • Ett fel uppstod när meddelandet bearbetades eller så överskreds tidsgränsen av fjärrvärden.
  • Problem med underliggande nätverksresurser.

Lösning

SocketException-felen anger att den virtuella dator som är värd för programmen inte kan konvertera namnet <mynamespace>.servicebus.windows.net till motsvarande IP-adress.

Kontrollera om kommandot nedan lyckas mappa till en IP-adress.

PS C:\> nslookup <mynamespace>.servicebus.windows.net

som ska ge utdata enligt nedan

Name:    <cloudappinstance>.cloudapp.net
Address:  XX.XX.XXX.240
Aliases:  <mynamespace>.servicebus.windows.net

Om ovanstående namn inte matchar en IP-adress och namnområdesalias kontrollerar du vilken nätverksadministratör som ska undersökas ytterligare. Namnmatchning görs via en DNS-server, vanligtvis en resurs i kundens nätverk. Om DNS-matchningen görs av Azure DNS kontaktar du pomoc techniczna platformy Azure.

Om namnmatchningen fungerar som förväntat kontrollerar du om anslutningar till Azure Service Bus tillåts här

MessagingException

Orsak

MessagingException är ett allmänt undantag som kan genereras av olika skäl. Några av orsakerna visas nedan.

  • Ett försök görs att skapa en QueueClient för ett ämne eller en prenumeration.
  • Storleken på meddelandet som skickas är större än gränsen för den angivna nivån. Läs mer om Service Bus-kvoter och -gränser.
  • Specifika dataplansbegäran (skicka, ta emot, slutföra, överge) avbröts på grund av begränsning.
  • Tillfälliga problem som orsakas av tjänstuppgraderingar och omstarter.

Anteckning

Listan över undantag ovan är inte fullständig.

Lösning

Lösningsstegen beror på vad som orsakade att MessagingException utlöstes.

  • För tillfälliga problem (där isTransient är inställt på sant) eller för begränsningsproblem kan det lösa problemet genom att försöka igen. Standardprincipen för återförsök i SDK:t kan användas för detta.
  • För andra problem anger informationen i undantaget att problemet och lösningsstegen kan härledas från samma.

StorageQuotaExceededException

Orsak

StorageQuotaExceededException genereras när den totala storleken på entiteter i ett premiumnamnområde överskrider gränsen på 1 TB per meddelandeenhet.

Lösning

  • Öka antalet meddelandeenheter som har tilldelats premiumnamnområdet
  • Om du redan använder maximalt antal tillåtna meddelandeenheter för ett namnområde skapar du ett separat namnområde.

Nästa steg

Den fullständiga Service Bus .NET API-referensen finns i Azure .NET API-referensen. Felsökningstips finns i felsökningsguiden