Service Bus výjimky zasílání zpráv
tento článek obsahuje seznam výjimek rozhraní .net generovaných rozhraními api .NET Framework.
Kategorie výjimek
Rozhraní API pro zasílání zpráv generují výjimky, které mohou být v následujících kategoriích, spolu s přidruženou akcí, kterou můžete provést při pokusu o jejich opravu. Význam a příčiny výjimky se mohou lišit v závislosti na typu entity zasílání zpráv:
- Chyba kódování uživatele (System. ArgumentException, System. InvalidOperationException, System. OperationCanceledException, System. Runtime. Serialization. SerializationException). Obecná akce: Zkuste opravit kód, než budete pokračovat.
- Chyba nastavení/konfigurace (Microsoft. ServiceBus. Messaging. MessagingEntityNotFoundException, System. UnauthorizedAccessException. Obecná akce: Zkontrolujte konfiguraci a v případě potřeby proveďte změny.
- Přechodné výjimky (Microsoft. ServiceBus. Messaging. MessagingException, Microsoft. ServiceBus. Messaging. výjimka serverbusyexception, Microsoft. ServiceBus. Messaging. MessagingCommunicationException). Obecná akce: zkuste operaci zopakovat nebo upozorněte uživatele.
RetryPolicyTřídu v klientské sadě SDK lze nakonfigurovat tak, aby zpracovávala opakované pokusy automaticky. Další informace najdete v tématu pokyny pro opakování. - Další výjimky (System. Transactions. TransactionException, System. TimeoutException, Microsoft. ServiceBus. Messaging. MessageLockLostException, Microsoft. ServiceBus. Messaging. SessionLockLostException). Obecná akce: specifická pro typ výjimky; informace najdete v tabulce v následující části:
Typy výjimek
V následující tabulce jsou uvedeny typy výjimek zasílání zpráv a jejich příčiny a poznámky navrhovaná akce, které můžete provést.
| Typ výjimky | Popis/příčiny/příklady | Navrhovaná akce | Poznámka k automatickému/okamžitému opakování |
|---|---|---|---|
| TimeoutException | Server neodpověděl na požadovanou operaci v zadaném čase, který je řízen OperationTimeout. Je možné, že server dokončil požadovanou operaci. K tomu může dojít z důvodu zpoždění sítě nebo jiné infrastruktury. | Ověřte konzistenci stavu systému a v případě potřeby akci opakujte. Viz výjimky časového limitu. | V některých případech může být užitečné zkusit to znovu. Přidejte do kódu logiku opakování. |
| InvalidOperationException | Požadovaná operace uživatele není povolena v rámci serveru nebo služby. Podrobnosti najdete ve zprávě výjimky. Například Complete () vygeneruje tuto výjimku, pokud byla zpráva přijata v režimu ReceiveAndDelete . | Podívejte se na kód a dokumentaci. Ujistěte se, že požadovaná operace je platná. | Nemůžete to zkusit znovu. |
| OperationCanceledException | Došlo k pokusu o vyvolání operace u objektu, který již byl uzavřen, přerušen nebo vyřazen. Ve výjimečných případech je ambientní transakce již uvolněna. | Zkontrolujte kód a ujistěte se, že nevyvolává operace u uvolněného objektu. | Nemůžete to zkusit znovu. |
| UnauthorizedAccessException | Objekt TokenProvider nemohl získat token, token je neplatný nebo token neobsahuje deklarace identity vyžadované k provedení operace. | Ujistěte se, že Poskytovatel tokenů je vytvořený se správnými hodnotami. Ověřte konfiguraci Access Control Service. | V některých případech může být užitečné zkusit to znovu. Přidejte do kódu logiku opakování. |
| ArgumentException ArgumentNullException ArgumentOutOfRangeException |
Jeden nebo více argumentů dodaných metodě je neplatných. Identifikátor URI zadaný pro NamespaceManager nebo Create obsahuje segmenty cesty. Schéma identifikátoru URI zadané pro NamespaceManager nebo Vytvoření je neplatné. Hodnota vlastnosti je větší než 32 KB. |
Zkontrolujte kód volajícího a ujistěte se, že jsou argumenty správné. | Nemůžete to zkusit znovu. |
| MessagingEntityNotFoundException | Entita přidružená k operaci neexistuje nebo byla odstraněna. | Ujistěte se, že entita existuje. | Nemůžete to zkusit znovu. |
| MessageNotFoundException | Došlo k pokusu o přijetí zprávy s určitým pořadovým číslem. Tato zpráva se nenašla. | Ujistěte se, že zpráva již nebyla přijata. Zkontrolujte frontu nedoručených zpráv a podívejte se, zda byla zpráva deadlettered. | Nemůžete to zkusit znovu. |
| MessagingCommunicationException | Klient nemůže navázat připojení k Service Bus. | Ujistěte se, že je zadaný název hostitele správný a že je hostitel dosažitelný. pokud je váš kód spuštěn v prostředí s bránou firewall nebo proxy, zajistěte, aby přenosy do Service Bus domény/IP adresy a porty nebyly blokované. |
Zkuste to znovu, pokud dojde k problémům s přerušovaným připojením. |
| Výjimka serverbusyexception | Služba v tuto chvíli nemůže zpracovat požadavek. | Klient může na určitou dobu počkat a pak operaci zopakovat. | Klient může po určitém intervalu opakovat pokus. Pokud výsledkem opakování dojde k jiné výjimce, ověřte chování této výjimky znovu. |
| MessagingException | Obecná výjimka zasílání zpráv, která může být vyvolána v následujících případech: Byl proveden pokus o vytvoření QueueClient pomocí názvu nebo cesty, která patří k jinému typu entity (například téma). Byl proveden pokus o odeslání zprávy, která je větší než 256 KB. U serveru nebo služby došlo k chybě během zpracování žádosti. Podrobnosti najdete ve zprávě výjimky. Obvykle se jedná o přechodnou výjimku.Požadavek se ukončil, protože entita je omezená. Kód chyby: 50001, 50002, 50008. |
Zkontrolujte kód a zajistěte, aby se pro tělo zprávy používaly pouze serializovatelné objekty (nebo použijte vlastní serializátor). Vyhledejte v dokumentaci podporované typy hodnot vlastností a používejte pouze podporované typy. Ověřte vlastnost- přechodný . Pokud je to pravda, můžete operaci zopakovat. |
Pokud je výjimka způsobena omezením, počkejte několik sekund a operaci opakujte. Chování při opakování není definované a nemusí pomáhat v dalších scénářích. |
| MessagingEntityAlreadyExistsException | Pokusí se vytvořit entitu s názvem, který už používá jiná entita v daném oboru názvů služby. | Odstraňte existující entitu nebo vyberte jiný název entity, která se má vytvořit. | Nemůžete to zkusit znovu. |
| QuotaExceededException | Entita zasílání zpráv dosáhla maximální povolené velikosti nebo byl překročen maximální počet připojení k oboru názvů. | Přiřadíte místo v entitě příjem zpráv z entity nebo jejích podfront. Viz QuotaExceededException. | Pokud se zprávy během této doby odstranily, může to zkusit znovu. |
| RuleActionException | Service Bus vrátí tuto výjimku, pokud se pokusíte vytvořit neplatnou akci pravidla. Service Bus připojí tuto výjimku ke zprávě deadlettered, pokud dojde k chybě při zpracování akce pravidla pro tuto zprávu. | Ověřte správnost akce pravidla. | Nemůžete to zkusit znovu. |
| FilterException | Service Bus vrátí tuto výjimku, pokud se pokusíte vytvořit neplatný filtr. Service Bus připojí tuto výjimku ke zprávě deadlettered, pokud došlo k chybě při zpracování filtru pro tuto zprávu. | Ověřte správnost filtru. | Nemůžete to zkusit znovu. |
| SessionCannotBeLockedException | Došlo k pokusu o přijetí relace s určitým ID relace, ale relace je aktuálně uzamčena jiným klientem. | Ujistěte se, že je relace odemčena ostatními klienty. | Zkuste to znovu, pokud byla relace vydaná v provizorním režimu. |
| TransactionSizeExceededException | Transakce je příliš mnoho operací. | Snižte počet operací, které jsou součástí této transakce. | Nemůžete to zkusit znovu. |
| MessagingEntityDisabledException | Požadavek na běhovou operaci u zakázané entity | Aktivujte entitu. | Zkuste to znovu, pokud se entita aktivovala průběžně. |
| NoMatchingSubscriptionException | Service Bus vrátí tuto výjimku, pokud odešlete zprávu do tématu s povoleným předfiltrem a žádný z filtrů neodpovídá. | Ujistěte se, že alespoň jeden filtr odpovídá. | Nemůžete to zkusit znovu. |
| MessageSizeExceededException | Datová část zprávy překračuje limit 256 KB. Limit 256-KB je celková velikost zprávy, která může zahrnovat systémové vlastnosti a veškeré režie technologie .NET. | Snižte velikost datové části zprávy a potom operaci opakujte. | Nemůžete to zkusit znovu. |
| TransactionException | Ambientní transakce ( Transaction.Current ) je neplatná. Je možné, že byla dokončena nebo přerušena. Vnitřní výjimka může poskytovat další informace. |
Nemůžete to zkusit znovu. | |
| TransactionInDoubtException – | Došlo k pokusu o provedení operace v transakci, která je nejistá, nebo dojde k pokusu o potvrzení transakce a transakce se stane nejistými. | Vaše aplikace musí tuto výjimku zpracovat (jako zvláštní případ), protože transakce již byla potvrzena. | - |
QuotaExceededException
QuotaExceededException indikuje, že došlo k překročení kvóty pro některou z entit.
Fronty a témata
U front a témat je často velikost fronty. Vlastnost chybová zpráva obsahuje další podrobnosti, jako v následujícím příkladu:
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
Zpráva uvádí, že téma překročilo omezení velikosti, v tomto případě 1 GB (výchozí omezení velikosti).
Obory názvů
Pro obory názvů může QuotaExceededException značit, že aplikace překročila maximální počet připojení k oboru názvů. Příklad:
Microsoft.ServiceBus.Messaging.QuotaExceededException: ConnectionsQuotaExceeded for namespace xxx.
<tracking-id-guid>_G12 --->
System.ServiceModel.FaultException`1[System.ServiceModel.ExceptionDetail]:
ConnectionsQuotaExceeded for namespace xxx.
Běžné příčiny
Existují dva běžné příčiny této chyby: fronta nedoručených zpráv a přijímače nefunkčních zpráv.
Fronta nedoručených zpráv U čtecího modulu se nedaří dokončit zprávy a zprávy jsou po vypršení zámku vráceny do fronty nebo tématu. K tomu může dojít, pokud Čtenář narazí na výjimku, která zabrání v volání BrokeredMessage. Complete. Po 10 časech se zpráva ve výchozím nastavení přesune do fronty nedoručených zpráv. Toto chování je řízeno vlastností QueueDescription. MaxDeliveryCount a má výchozí hodnotu 10. Vzhledem k tomu, že se zprávy dostanou ve frontě nedoručených zpráv, zabírají místo.
Chcete-li tento problém vyřešit, přečtěte si a dokončete zprávy z fronty nedoručených zpráv, stejně jako z jakékoli jiné fronty. Můžete použít metodu FormatDeadLetterPath , která vám pomůžou naformátovat cestu fronty nedoručených zpráv.
Přijímač byl zastaven. Příjemce zastavil přijímání zpráv z fronty nebo odběru. Způsob, jak to zjistit, je podívat se na vlastnost QueueDescription. MessageCountDetails , která zobrazuje úplné rozpis zpráv. Pokud je vlastnost ActiveMessageCount vysoká nebo roste, zprávy nejsou čteny tak rychle, jak jsou zapisovány.
TimeoutException
TimeoutException označuje, že operace iniciovaná uživatelem trvá déle, než je časový limit operace.
Měli byste zaškrtnout hodnotu vlastnosti Třída ServicePointManager. DefaultConnectionLimit , protože po dosažení tohoto limitu může také dojít k TimeoutException.
očekává se, že dojde k vypršení časového limitu během operací údržby, jako jsou například aktualizace služby Service Bus (nebo) aktualizace operačního systému na prostředky, které službu spouštějí. Během aktualizace operačního systému se entity pohybují a uzly se aktualizují nebo restartují, což může způsobit vypršení časových limitů. podrobnosti o smlouvě o úrovni služeb (sla) pro službu Azure Service Bus najdete v tématu SLA pro Service Bus.
Fronty a témata
V případě front a témat je časový limit zadán buď ve vlastnosti MessagingFactorySettings. OperationTimeout jako součást připojovacího řetězce, nebo prostřednictvím ServiceBusConnectionStringBuilder. Chybová zpráva se může lišit, ale vždy obsahuje hodnotu časového limitu zadanou pro aktuální operaci.
MessageLockLostException
Příčina
MessageLockLostException se vyvolá při přijetí zprávy pomocí režimu přijetí PeekLock a zámek, který uchovává klient, vyprší na straně služby.
Zámek zprávy může vypršet z různých důvodů:
- Platnost časovače zámku vypršela před tím, než byla obnovena klientskou aplikací.
- Klientská aplikace získala zámek, uložila ho do trvalého úložiště a pak se restartovala. Po restartu se klientská aplikace vyhledá ve zprávách o letu a pokusila se je dokončit.
Řešení
V případě MessageLockLostException nemůže klientská aplikace nadále zprávu zpracovat. Klientská aplikace může volitelně zvážit protokolování výjimky pro účely analýzy, ale klient musí zprávu vyřadit.
Vzhledem k tomu, že zámek zprávy vypršel, by se mohl vrátit do fronty (nebo předplatného) a může je zpracovat další klientská aplikace, která volá příjem.
Pokud MaxDeliveryCount překročí, může se zpráva přesunout do DeadLetterQueue.
SessionLockLostException
Příčina
SessionLockLostException je vyvolána, když je relace přijata, a zámek, který uchovává klient, vyprší na straně služby.
Zámek relace může vypršet z různých důvodů:
- Platnost časovače zámku vypršela před tím, než byla obnovena klientskou aplikací.
- Klientská aplikace získala zámek, uložila ho do trvalého úložiště a pak se restartovala. Po restartu se klientská aplikace vyhledala v podletových relacích a pokusila se zpracovat zprávy v těchto relacích.
Řešení
V případě SessionLockLostException nemůže klientská aplikace nadále zpracovávat zprávy v relaci. Klientská aplikace může zvážit protokolování výjimky pro účely analýzy, ale klient musí zprávu vyřadit.
Vzhledem k tomu, že zámek relace vypršel, vrátí se zpátky do fronty (nebo předplatného) a může být uzamčený další klientskou aplikací, která relaci přijme. Vzhledem k tomu, že zámek relace je uchováván v jediné klientské aplikaci v daném okamžiku, je zaručeno zpracování v daném pořadí.
SocketException
Příčina
SocketException je vyvolána v následujících případech:
- Pokus o připojení se nezdaří, protože hostitel po uplynutí určité doby neodpověděl správně (kód chyby TCP 10060).
- Navázání připojení selhalo, protože se nepovedlo odpovědět připojenému hostiteli.
- Při zpracování zprávy došlo k chybě nebo časový limit je překročen vzdáleným hostitelem.
- Problém související se síťovými prostředky
Řešení
Chyby SocketException označují, že virtuální počítač hostující aplikace není schopen převést název <mynamespace>.servicebus.windows.net na odpovídající IP adresu.
Zkontrolujte, zda je příkaz v mapování na IP adresu úspěšný, v části.
PS C:\> nslookup <mynamespace>.servicebus.windows.net
který by měl poskytnout výstup níže
Name: <cloudappinstance>.cloudapp.net
Address: XX.XX.XXX.240
Aliases: <mynamespace>.servicebus.windows.net
Pokud se výše uvedený název nepřekladuje na IP adresu a alias oboru názvů, zkontrolujte, který správce sítě další prozkoumat. Překlad názvů se provádí prostřednictvím serveru DNS obvykle prostřednictvím prostředku v síti zákazníka. Pokud se překlad DNS provádí Azure DNS kontaktujte prosím podporu Azure.
pokud překlad názvů funguje podle očekávání, ověřte, jestli tady je povolená připojení k Azure Service Bus.
MessagingException
Příčina
MessagingException je obecná výjimka, která může být vyvolána z různých důvodů. Níže jsou uvedeny některé z důvodů.
- Došlo k pokusu o vytvoření QueueClient na téma nebo v předplatném.
- Velikost odeslané zprávy je větší než limit dané úrovně. přečtěte si další informace o kvótách Service Bus a omezeních.
- Konkrétní požadavek na rovinu dat (odeslání, přijetí, dokončení, opuštění) byl ukončen z důvodu omezení.
- Přechodné problémy způsobily kvůli upgradům a restartům služby.
Poznámka
Výše uvedený seznam výjimek není vyčerpávající.
Řešení
Postup řešení závisí na tom, co způsobilo vyvolání MessagingException .
- V případě přechodného problému (kde je to velmi přechodný příkaz_ nastaveno na _true_) nebo pro problémy s omezením, opakování operace může problém vyřešit. Pro tuto operaci je možné využít výchozí zásady opakování v sadě SDK.
- V případě jiných problémů se v podrobnostech výjimky označují problémy a postup řešení je možné odvodit ze stejného.
StorageQuotaExceededException
Příčina
StorageQuotaExceededException se generuje, když celková velikost entit v oboru názvů Premium překračuje limit 1 TB za jednotku zasílání zpráv.
Řešení
- Zvýšit počet jednotek zasílání zpráv přiřazených k oboru názvů Premium
- Pokud již používáte maximální povolené jednotky pro zasílání zpráv pro obor názvů, vytvořte samostatný obor názvů.
Další kroky
kompletní referenční informace k rozhraní .net api pro Service Bus najdete v referenčních informacích k rozhraní Azure .net api. Tipy pro řešení potíží najdete v Průvodci odstraňováním potíží .