Service Broker-foutberichten verwerken

Van toepassing op:SQL ServerAzure SQL Managed Instance

Service Broker-toepassingen moeten twee typen foutberichten verwerken die zijn ontvangen van gesprekken: foutberichten die zijn gemaakt door een toepassing die gebruikmaakt van Service Broker en systeemberichten die zijn gemaakt door Service Broker.

Foutvoorwaarden voor toepassing rapporteren

Service Broker-toepassingen zijn doorgaans systemen die bestaan uit code die asynchroon op verschillende computers wordt uitgevoerd. De delen van de toepassing communiceren met elkaar met behulp van berichten die zijn verzonden in Service Broker-gesprekken. Het deel van de toepassing aan de ene kant van een Service Broker-gesprek kan toepassingsfouten aan de andere kant rapporteren door foutberichten te verzenden. Het ontvangende deel van de toepassing moet code hebben om een foutbericht te detecteren en de foutvoorwaarde correct af te handelen.

Service Broker-toepassingen kunnen fouten communiceren met behulp van door het systeem gedefinieerde of toepassingsgedefinieerde berichttypen.

Door het systeem gedefinieerde foutberichten

Gebruik de WITH ERROR component van de END CONVERSATION instructie om toepassingsfouten te melden die ernstig genoeg zijn om het gesprek te beëindigen. Voorbeeld:

END CONVERSATION @ConversationHandle
    WITH ERROR = 1234 DESCRIPTION = 'The account specified in the invoice does not exist, verify the account number.';

De END CONVERSATION WITH ERROR instructie:

  • Genereert een Service Broker-systeemfoutbericht en verzendt het naar de externe kant van het gesprek. De foutberichten maken gebruik van het door het systeem gedefinieerde https://schemas.microsoft.com/SQL/ServiceBroker/Error berichttype.

  • Hiermee beëindigt u de lokale kant van het gesprek.

Het deel van de toepassing dat het Error bericht ontvangt, moet alle benodigde opschoning uitvoeren en de kant van het gesprek beëindigen.

Een toepassing kan op elk gewenst moment een actief gesprek beëindigen met een fout. Als de externe kant van het gesprek het gesprek echter al heeft beëindigd, verzendt Service Broker het foutbericht niet naar de externe kant. In plaats daarvan beëindigt Service Broker de lokale kant van het gesprek en verwijdert alle berichten voor het gesprek uit de lokale wachtrij.

Door de toepassing gedefinieerde foutberichten

U kunt door de toepassing gedefinieerde foutberichten gebruiken om fouten te melden die niet ernstig genoeg zijn om een gesprek te beëindigen. De toepassingsontwerper kan het volgende opgeven:

  • Een of meer berichttypen die worden gebruikt om deze toepassingsfouten te communiceren.
  • De logica voor het verwerken van deze berichttypen.

Het deel van de toepassing dat de foutvoorwaarde tegenkomt, kan het volgende doen:

  • Voer een vereiste opschoning uit voor de lokale kant van het gesprek.
  • Maak een bericht met behulp van het door de toepassing gedefinieerde berichttype en verzend het in het gesprek.

Het externe deel van de toepassing dat het foutbericht ontvangt, moet code hebben om het foutbericht te herkennen en eventuele vereiste opschoning aan de zijkant van de verbinding uit te voeren.

Foutberichten verwerken

Toepassingscode die berichten van Service Broker-gesprekken ontvangt, moet logica hebben om foutberichten te verwerken die zijn ontvangen van het gesprek. De code moet het volgende detecteren en afhandelen:

  • Foutberichten die worden gegenereerd door een toepassing die gebruikmaakt van een door de toepassing gedefinieerd foutberichttype.

  • Foutberichten die worden gegenereerd door een toepassing die gebruikmaakt van de WITH ERROR component van de END CONVERSATION instructie. Deze foutberichten gebruiken het https://schemas.microsoft.com/SQL/ServiceBroker/Error berichttype en hebben een positief getal in het Code element.

  • Foutberichten gegenereerd door Service Broker. Deze foutberichten gebruiken het https://schemas.microsoft.com/SQL/ServiceBroker/Error berichttype en hebben een negatief getal in het code-element . Service Broker maakt een foutbericht wanneer een fout het onmogelijk maakt voor Service Broker om het gesprek voort te zetten. Service Broker kan bijvoorbeeld de doelservice niet vinden omdat de service niet bestaat in het huidige exemplaar en er geen vermelding is voor de service in de routeringstabel. In deze situatie maakt Service Broker een Error bericht voor het gesprek.

De resultatenset die door de RECEIVE instructie wordt geretourneerd, bevat een message_type_name kolom. Code die Service Broker-berichten ontvangt, wordt doorgaans gebruikt message_type_name om elk bericht te routeren naar code waarmee het bijbehorende berichttype wordt verwerkt.

De exacte logica die een programma volgt om de fout af te handelen, is afhankelijk van de toepassing. Een voorbeeld is een programma dat gebruikmaakt van berichtretentie en compenserende transacties vereist wanneer de taak mislukt. Wanneer er een fout wordt ontvangen, vraagt het programma de wachtrij op voor de berichten die al zijn verwerkt, voert compenserende transacties uit en eindigt het gesprek. Als het programma daarentegen alleen moet vastleggen dat er een fout is opgetreden, registreert het programma de fout in een logboektabel en eindigt het gesprek.

Het Code element van het https://schemas.microsoft.com/SQL/ServiceBroker/Error bericht bevat de foutcode. Error berichten die zijn gemaakt door een toepassing die gebruikmaakt END CONVERSATION WITH ERROR van een positieve waarde voor de foutcode. Error berichten die door Service Broker worden gegenereerd, bevatten negatieve waarden voor de foutcode. De Code waarde in berichten die door Service Broker worden gegenereerd, is alleen de genegeerde waarde van de fout die het Error bericht heeft veroorzaakt. Wanneer bijvoorbeeld een XML-validatiefout (foutcode 9615) optreedt, maakt de database-engine een Error bericht met een Code element dat de waarde -9615bevat.

Zodra een toepassing een Error bericht ontvangt, kan het programma geen berichten meer verzenden in dat gesprek. De toepassing verwerkt de fout en beëindigt vervolgens de kant van het gesprek. Als een toepassing een door de toepassing gedefinieerd foutberichttype ontvangt, is het gesprek nog steeds beschikbaar, tenzij het externe deel van de toepassing ook is uitgevoerd END CONVERSATION.

Routines voor foutafhandeling moeten zodanig worden gecodeerd dat gifberichten worden voorkomen. Zie Gifberichten verwerken voor meer informatie.