Service Bus undantag för meddelanden
Den här artikeln innehåller de .NET-undantag som genereras av .NET Framework-API:er.
Undantagskategorier
Meddelande-API:erna genererar undantag som kan indela 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:
- 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.
- Installations-/konfigurationsfel (Microsoft.ServiceBus.Messaging.MessagingEntityNotFoundException, System.UnauthorizedAccessException. Allmän åtgärd: Granska konfigurationen och ändra om det behövs.
- Tillfälliga undantag (Microsoft.ServiceBus.Messaging.MessagingException, Microsoft.ServiceBus.Messaging.ServerBusyException, Microsoft.ServiceBus.Messaging.MessagingCommunicationException). Allmän åtgärd: Försök igen eller meddela användarna. Klassen
RetryPolicyi klient-SDK:n kan konfigureras för att hantera återförsök automatiskt. Mer information finns i Vägledning för återförsök. - Andra undantag (System.Transactions.TransactionException, System.TimeoutException, Microsoft.ServiceBus.Messaging.MessageLockLostException, Microsoft.ServiceBus.Messaging.SessionLockLostException). Allmän åtgärd: specifik för undantagstypen; se tabellen i följande avsnitt:
Undantagstyper
I följande tabell visas undantagstyper för meddelanden och deras orsaker, samt information om föreslagna åtgärder som du kan vidta.
| Undantagstyp | Beskrivning/orsak/exempel | Föreslagen åtgärd | Information om automatiska/omedelbara å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 fördröjningar i nätverket eller annan infrastruktur. | Kontrollera systemtillståndet för konsekvens och försök igen om det behövs. Se Timeout-undantag. | Omförsök kan vara till hjälp i vissa fall. lägg till logik för omfö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 ReceiveAndDelete-läge. | Kontrollera koden och dokumentationen. Kontrollera att den begärda åtgärden är giltig. | Återförsök hjälper inte. |
| 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 bortskaffat objekt. | Återförsök hjälper inte. |
| UnauthorizedAccessException | TokenProvider-objektet kunde inte hämta en token, token är ogiltigt eller så innehåller inte token de anspråk som krävs för att göra åtgärden. | Kontrollera att tokenprovidern har skapats med rätt värden. Kontrollera konfigurationen av Access Control Service. | Omförsök kan vara till hjälp i vissa fall. lägg till logik för omförsök i koden. |
| ArgumentException ArgumentNullException ArgumentOutOfRangeException |
Ett eller flera argument som anges till metoden är ogiltiga. URI:n som angetts till NamespaceManager eller Create innehåller sökvägssegment. URI-schemat som angetts till NamespaceManager eller Create är ogiltigt. Egenskapsvärdet är större än 32 KB. |
Kontrollera den anropande koden och kontrollera att argumenten är korrekta. | Återförsök hjälper inte. |
| MessagingEntityNotFoundException | Entiteten som är associerad med åtgärden finns inte eller har tagits bort. | Kontrollera att entiteten finns. | Återförsök hjälper inte. |
| 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 tagits bort. | Återförsök hjälper inte. |
| 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/proxyserver ska du se till att trafiken till Service Bus-domän/IP-adress och portar inte blockeras. |
Försök igen om det uppstår tillfälliga anslutningsproblem. |
| ServerBusyException | Tjänsten kan inte bearbeta begäran just nu. | Klienten kan vänta en stund och sedan försöka 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 | Undantag för allmänna meddelanden som kan uppstå 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 avslutades eftersom entiteten begränsas. Felkod: 50001, 50002, 50008. |
Kontrollera koden och se till att endast serialiserbara objekt används för meddelandetexten (eller använder en anpassad serialiserare). Läs dokumentationen för 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 igen. |
Om undantaget beror på begränsning väntar du några sekunder och försöker sedan 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änstens namnområde. | Ta bort den befintliga entiteten eller välj ett annat namn för den entitet som ska skapas. | Återförsök hjälper inte. |
| QuotaExceededException | Meddelandeentiteten har nått sin högsta 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 underköer. Se QuotaExceededException. | Försök igen 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 här undantaget till ett meddelande som inte har utlösts om ett fel inträffar när regelåtgärden för meddelandet bearbetas. | Kontrollera regelåtgärden för att se om den är korrekt. | Det hjälper inte att göra ett nytt försök. |
| FilterException | Service Bus returnerar det här undantaget om du försöker skapa ett ogiltigt filter. Service Bus här undantaget till ett meddelande med felkod om ett fel uppstod under bearbetningen av filtret för meddelandet. | Kontrollera att filtret är korrekt. | Det hjälper inte att göra ett nytt försök. |
| 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 upplå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 göra ett nytt försök. |
| MessagingEntityDisabledException | Begäran om en körningsåtgärd på en inaktiverad entitet. | Aktivera entiteten. | Försök igen 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 göra ett nytt försök. |
| 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 göra ett nytt försök. |
| 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 göra ett nytt försök. | |
| TransactionInDoubtException | En åtgärd görs på en transaktion som är tveksam, eller ett försök görs att genomföra transaktionen och transaktionen blir osäker. | Programmet måste hantera det här undantaget (som ett specialfall), eftersom transaktionen kanske redan har genomförts. | - |
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 säger 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. 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 för obeställbara meddelanden och icke-fungerande meddelandemottagare.
Kö för instä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 förhindrar att den anropar BrokeredMessage.Complete. När ett meddelande har lästs 10 gånger flyttas det till kön för dead-letter som standard. Det här beteendet styrs av egenskapen QueueDescription.MaxDeliveryCount och har standardvärdet 10. När meddelanden hamnar i kön för dead letter tar de upp utrymme.
Lös problemet genom att läsa och slutföra meddelandena från kön för dead-letter, precis som från andra köer. Du kan använda metoden FormatDeadLetterPath för att formatera kösökvägen för oställbara meddelanden.
Mottagaren stoppade. En mottagare har slutat ta emot meddelanden från en kö eller prenumeration. Du kan identifiera detta genom att titta på egenskapen QueueDescription.MessageCountDetails, som visar en fullständig analys av meddelandena. Om egenskapen ActiveMessageCount är hög eller växer, läses inte meddelandena lika snabbt som de skrivs.
TimeoutException
En TimeoutException anger att en användarinitierad åtgärd tar längre tid än tidsgränsen för åtgärden.
Du bör kontrollera värdet för egenskapen ServicePointManager.DefaultConnectionLimit, eftersom en sådan gräns också kan orsaka timeoutException.
Tidsgränser förväntas inträffa under eller mellan olika underhållsåtgärder, till exempel Service Bus-tjänstuppdateringar (eller) OS-uppdateringar på resurser som kör tjänsten. Under os-uppdateringar flyttas entiteter runt och noderna uppdateras eller startas om, vilket kan orsaka tidsgränser. 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 anslutningssträngen 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 visas när ett meddelande tas emot med peekLock-mottagningsläget och låset som finns i klienten upphör att gälla på tjänstsidan.
Låset för ett meddelande kan upphöra att gälla på grund av olika orsaker:
- Låstimern har gått ut innan den förnyades av klientprogrammet.
- Klientprogrammet har köpt låset, sparat det i ett beständigt arkiv och sedan startats om. När det startades om tittade klientprogrammet på de inkommande 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 eventuellt överväga att logga undantaget för analys, men klienten måste ta bort meddelandet.
Eftersom låset för meddelandet har upphört att gälla, skulle det gå tillbaka i kön (eller prenumerationen) och kan bearbetas av nästa klientprogram som anropar tar emot.
Om MaxDeliveryCount har överskridits kan meddelandet flyttas till DeadLetterQueue.
SessionLockLostException
Orsak
SessionLockLostException utlöss när en session godkänns och låset som finns i klienten upphör att gälla på tjänstsidan.
Låset för en session kan upphöra att gälla på grund av olika orsaker:
- Låstimern har gått ut innan den förnyades av klientprogrammet.
- Klientprogrammet har köpt låset, sparat det i ett beständigt arkiv och sedan startats om. När det startades om tittade klientprogrammet på de aktiva sessionerna och försökte bearbeta meddelandena i dessa sessioner.
Lösning
I händelse av en SessionLockLostException kan klientprogrammet inte längre bearbeta meddelanden i sessionen. Klientprogrammet kan överväga att logga undantaget för analys, men klienten måste ta bort meddelandet.
Eftersom låset för sessionen har upphört att gälla, skulle det gå tillbaka i kön (eller prenumerationen) och kan låsas av nästa klientprogram som accepterar sessionen. Eftersom sessionslåset hålls kvar av ett enda klientprogram vid en viss tidpunkt garanteras den orderbaserade bearbetningen.
SocketException
Orsak
En SocketException utlöss i följande fall:
- När ett anslutningsförsök misslyckas på grund av att värden inte svarade korrekt efter en angiven tid (TCP-felkod 10060).
- En upprättad anslutning misslyckades eftersom den anslutna värden inte kunde svara.
- Det uppstod ett fel när meddelandet skulle bearbetas eller så överskreds tidsgränsen av fjärrvärden.
- Problem med underliggande nätverksresurser.
Lösning
SocketException-felen indikerar 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 med mappningen till en IP-adress.
PS C:\> nslookup <mynamespace>.servicebus.windows.net
som bör ge utdata enligt nedan
Name: <cloudappinstance>.cloudapp.net
Address: XX.XX.XXX.240
Aliases: <mynamespace>.servicebus.windows.net
Om namnet ovan inte matchar en IP-adress och namnområdesaliaset kontrollerar du vilken nätverksadministratör som ska undersökas ytterligare. Namnmatchning görs via en DNS-server, vanligtvis en resurs i kundnätverket. Kontakta Azure-supporten om DNS-Azure DNS dns-upplösningen.
Om namnmatchning 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 uppstå av olika orsaker. 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å det meddelande som skickas är större än gränsen för den angivna nivån. Läs mer om Service Bus och begränsningar.
- Specifik dataplansbegäran (skicka, ta emot, slutföra, avbryta) avslutades 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 _ har angetts till _true_) eller för problem med _ begränsning kan ett nytt försök med åtgärden lösa det. Standardprincipen för återförsök i SDK:n kan användas för detta.
- För andra problem anger informationen i undantaget 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 tilldelats till premium-namnområ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 referensen Service Bus .NET API finns i Azure .NET API-referensen. Felsökningstips finns i felsökningsguiden