Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Azure SQL Managed Instance
Service Broker-program måste hantera två typer av felmeddelanden som tas emot från konversationer: felmeddelanden som skapats av ett program som använder Service Broker och systemmeddelanden som skapats av Service Broker.
Feltillstånd för rapportprogram
Service Broker-program är vanligtvis system som består av kod som körs asynkront på olika datorer. De delar av programmet kommunicerar med varandra med hjälp av meddelanden som skickas i Service Broker-konversationer. Delen av programmet på ena sidan av en Service Broker-konversation kan rapportera programfel till den andra sidan genom att skicka felmeddelanden. Den mottagande delen av programmet måste ha kod för att identifiera ett felmeddelande och hantera feltillståndet korrekt.
Service Broker-program kan kommunicera fel med hjälp av antingen systemdefinierade eller programdefinierade meddelandetyper.
Systemdefinierade felmeddelanden
Använd instruktionssatsen WITH ERROREND CONVERSATION för att rapportera programfel som är tillräckligt allvarliga för att kräva att konversationen avslutas. Till exempel:
END CONVERSATION @ConversationHandle
WITH ERROR = 1234 DESCRIPTION = 'The account specified in the invoice does not exist, verify the account number.';
Instruktionen END CONVERSATION WITH ERROR :
Genererar ett service broker-systemfel och skickar det till fjärrsidan av konversationen. Felmeddelandena använder den systemdefinierade
https://schemas.microsoft.com/SQL/ServiceBroker/Errormeddelandetypen.Avslutar den lokala sidan av konversationen.
Den del av programmet som tar emot Error meddelandet bör göra all nödvändig rensning och avsluta sin sida av konversationen.
Ett program kan avsluta en aktiv konversation med ett fel när som helst. Men om fjärrsidan av konversationen redan har avslutat konversationen skickar Service Broker inte felmeddelandet till fjärrsidan. I stället avslutar Service Broker bara den lokala sidan av konversationen och tar bort alla meddelanden för konversationen från den lokala kön.
Programdefinierade felmeddelanden
Du kan använda programdefinierade felmeddelanden för att rapportera fel som inte är tillräckligt allvarliga för att avsluta en konversation. Programdesignern kan ange följande:
- En eller flera meddelandetyper som används för att kommunicera dessa programfel.
- Logiken för att hantera dessa meddelandetyper.
Den del av programmet som stöter på feltillståndet kan göra följande:
- Utför all nödvändig rensning för den lokala sidan av konversationen.
- Skapa ett meddelande med den programdefinierade meddelandetypen och skicka det i konversationen.
Fjärrdelen av programmet som tar emot felmeddelandet måste ha kod för att identifiera felmeddelandet och utföra nödvändig rensning på dess sida av anslutningen.
Hantera felmeddelanden
Programkod som tar emot meddelanden från Service Broker-konversationer måste ha logik för att bearbeta felmeddelanden som tas emot från konversationen. Koden måste identifiera och hantera följande:
Felmeddelanden som genereras av ett program som använder en programdefinierad felmeddelandetyp.
Felmeddelanden som genereras av ett program som använder instruktionens
WITH ERRORsatsEND CONVERSATION. Dessa felmeddelandenhttps://schemas.microsoft.com/SQL/ServiceBroker/Erroranvänder meddelandetypen och har ett positivt tal i elementetCode.Felmeddelanden som genereras av Service Broker. Dessa felmeddelanden
https://schemas.microsoft.com/SQL/ServiceBroker/Erroranvänder meddelandetypen och har ett negativt tal i kodelementet . Service Broker skapar ett felmeddelande när ett fel gör det omöjligt för Service Broker att fortsätta konversationen. Service Broker kan till exempel inte hitta måltjänsten eftersom tjänsten inte finns i den aktuella instansen och det inte finns någon post för tjänsten i routningstabellen. I det här fallet skapar Service Broker ettErrormeddelande för konversationen.
Resultatuppsättningen som returneras av -instruktionen RECEIVE innehåller en message_type_name kolumn. Kod som tar emot Service Broker-meddelanden används message_type_name vanligtvis för att dirigera varje meddelande till kod som bearbetar den associerade meddelandetypen.
Den exakta logik som ett program följer för att hantera felet beror på programmet. Ett exempel är ett program som använder kvarhållning av meddelanden och som kräver kompenserande transaktioner när aktiviteten misslyckas. När ett fel tas emot frågar programmet kön efter de meddelanden som redan har bearbetats, utför kompenserande transaktioner och avslutar sedan konversationen. Om programmet däremot bara behöver registrera att ett fel uppstod loggar programmet felet till en loggningstabell och avslutar konversationen.
Elementet Code i https://schemas.microsoft.com/SQL/ServiceBroker/Error meddelandet innehåller felkoden.
Error meddelanden som skapats av ett program som använder END CONVERSATION WITH ERROR har ett positivt värde för felkoden.
Error meddelanden som genereras av Service Broker innehåller negativa värden för felkoden. Värdet Code i meddelanden som genereras av Service Broker är bara det negerade värdet för det fel som orsakade meddelandet Error . När till exempel ett XML-verifieringsfel (felkod 9615) inträffar skapar databasmotorn ett Error meddelande som har ett Code element som innehåller värdet -9615.
När ett program har fått ett Error meddelande kan programmet inte längre skicka meddelanden i konversationen. Programmet hanterar felet och avslutar sedan sin sida av konversationen. Om ett program får en programdefinierad felmeddelandetyp är konversationen fortfarande tillgänglig om inte fjärrdelen av programmet också körde END CONVERSATION.
Rutiner för felhantering bör kodas på ett sådant sätt att giftmeddelanden förhindras. Mer information finns i Hantera giftmeddelanden.