Behandeln von Service Broker-Fehlermeldungen

Service Broker-Anwendungen müssen zwei Typen von Fehlermeldungen behandeln, die aus Konversationen empfangen werden: Fehlermeldungen, die von einer Anwendung erstellt wurden, die Service Broker verwendet, und von Service Broker erstellte Systemmeldungen.

Melden von Anwendungsfehlerbedingungen

Service Broker-Anwendungen sind in der Regel Systeme, die aus Code bestehen, der asynchron auf unterschiedlichen Computern ausgeführt wird. Die einzelnen Teile der Anwendung kommunizieren über Nachrichten miteinander, die im Rahmen von Service Broker-Konversationen gesendet werden. Der Teil der Anwendung auf der einen Seite einer Service Broker-Konversation kann durch das Senden von Fehlermeldungen der anderen Seite Anwendungsfehler melden. Der empfangende Teil der Anwendung muss über Code zur Erkennung von Fehlermeldungen verfügen und die Fehlerbedingung richtig behandeln.

Service Broker-Anwendungen können Fehler entweder mithilfe von systemdefinierten oder mithilfe von anwendungsdefinierten Nachrichtentypen übermitteln.

Systemdefinierte Fehlermeldungen

Verwenden Sie die WITH ERROR-Klausel der END CONVERSATION-Anweisung zum Melden von Anwendungsfehlern, die so schwer sind, dass die Konversation beendet werden muss. Beispiel:

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

Die END CONVERSATION WITH ERROR-Anweisung:

  • Erzeugt eine Service Broker-Systemfehlermeldung und sendet diese an die Remoteseite der Konversation. In den Fehlermeldungen wird der systemdefinierte Nachrichtentyp https://schemas.microsoft.com/SQL/ServiceBroker/Error verwendet.

  • Beendet die lokale Seite der Konversation

Der Teil der Anwendung, der die Error-Meldung empfängt, sollte alle erforderlichen Cleanupmaßnahmen ausführen und die eigene Seite der Konversation beenden.

Eine Anwendung kann eine aktive Konversation jederzeit mit einem Fehler beenden. Falls die Remoteseite jedoch bereits die Konversation beendet hat, sendet Service Broker keine Fehlermeldung an die Remoteseite. Stattdessen beendet Service Broker lediglich die lokale Seite der Konversation und entfernt alle Nachrichten für die Konversation aus der lokalen Warteschlange.

Anwendungsdefinierte Fehlermeldungen

Mithilfe von anwendungsdefinierten Fehlermeldungen können Sie weniger schwere Fehler melden, bei denen eine Konversation nicht beendet werden muss. Der Anwendungs-Designer kann Folgendes angeben:

  • Einen oder mehrere Nachrichtentypen, die zur Übermittlung dieser Anwendungsfehler verwendet werden

  • Die Logik für die Behandlung dieser Nachrichtentypen

Der Teil der Anwendung, der die Fehlerbedingung ermittelt, kann folgende Aktionen ausführen:

  • Er kann alle erforderlichen Cleanupmaßnahmen für die lokale Seite der Konversation ausführen.

  • Er kann mithilfe des anwendungsdefinierten Nachrichtentyps eine Meldung erstellen und diese innerhalb der Konversation senden.

Der Remoteteil der Anwendung, der die Fehlermeldung empfängt, muss über Code zum Erkennen der Fehlermeldung verfügen und auf der eigenen Seite der Verbindung alle erforderlichen Cleanupmaßnahmen ausführen.

Behandeln von Fehlermeldungen

Anwendungscode, der Nachrichten aus Service Broker-Konversationen empfängt, muss über Logik zur Verarbeitung von Fehlermeldungen verfügen, die aus der Konversation empfangen werden. Folgendes muss vom Code erkannt und behandelt werden:

  • Fehlermeldungen, die von einer Anwendung erzeugt werden, die einen anwendungsdefinierten Fehlermeldungstyp verwendet

  • Fehlermeldungen, die von einer Anwendung erzeugt werden, die die WITH ERROR-Klausel der END CONVERSATION-Anweisung verwendet. In diesen Fehlermeldungen wird der Nachrichtentyp https://schemas.microsoft.com/SQL/ServiceBroker/Error verwendet. Sie weisen im Code-Element eine positive Zahl auf.

  • Von Service Broker erzeugte Fehlermeldungen. In diesen Fehlermeldungen wird der Nachrichtentyp https://schemas.microsoft.com/SQL/ServiceBroker/Error verwendet. Sie weisen im Code-Element eine negative Zahl auf. Service Broker erstellt eine Error-Meldung, wenn Service Broker die Konversation wegen eines Fehlers nicht fortsetzen kann. Service Broker kann beispielsweise den Zieldienst nicht finden, weil dieser nicht in der aktuellen Instanz vorhanden ist und die Routingtabelle keinen Eintrag für den Dienst enthält. In dieser Situation erstellt Service Broker eine Error-Meldung für die Konversation.

Das von der RECEIVE-Anweisung zurückgegebene Resultset enthält eine Spalte message_type_name. In der Regel leitet Code, der Service Broker-Nachrichten empfängt, anhand von message_type_name die einzelnen Nachrichten an Code weiter, der den zugehörigen Nachrichtentyp verarbeitet.

Welche Fehlerbehandlungslogik einem Programm dabei zu Grunde liegt, hängt von der Anwendung ab. Ein Beispiel ist ein Programm mit Nachrichtenbeibehaltung, das beim Fehlschlagen des Tasks kompensierende Transaktionen erfordert. Beim Empfang des Fehlers fragt das Programm die bereits verarbeiteten Nachrichten in der Warteschlange ab, führt die kompensierenden Transaktionen aus und beendet dann die Konversation. Muss das Programm hingegen nur aufzeichnen, dass ein Fehler aufgetreten ist, protokolliert es den Fehler in einer Protokollierungstabelle und beendet die Konversation.

Das Code-Element der Meldung https://schemas.microsoft.com/SQL/ServiceBroker/Error enthält den Fehlercode. Error-Meldungen, die von einer Anwendung erstellt werden, in der END CONVERSATION WITH ERROR verwendet wird, weisen einen positiven Wert für den Fehlercode auf. Von Service Broker erzeugte Error-Meldungen enthalten negative Werte für den Fehlercode. Beim Code-Wert in den von Service Broker erzeugten Nachrichten handelt es sich lediglich um den negierten Wert des Fehlers, der zur Error-Meldung geführt hat. Wenn beispielsweise ein XML-Überprüfungsfehler (Fehlercode 9615) auftritt, erstellt Database Engine (Datenbankmodul) eine Error-Meldung mit einem Code-Element, das den Wert -9615 enthält.

Sobald eine Anwendung eine Error-Meldung empfängt, kann das Programm im Rahmen dieser Konversation keine Nachrichten mehr senden. Die Anwendung behandelt den Fehler und beendet dann die eigene Seite der Konversation. Empfängt eine Anwendung einen anwendungsdefinierten Fehlermeldungstyp, ist die Konversation weiterhin verfügbar, es sei denn, der Remoteteil der Anwendung hat ebenfalls END CONVERSATION ausgeführt.

Fehlerbehandlungsroutinen sollten so codiert werden, dass nicht verarbeitbare Nachrichten verhindert werden. Weitere Informationen finden Sie unter Behandeln von nicht verarbeitbaren Nachrichten.