Abrufen von Benachrichtigungen

Zahlreiche Anwendungen erfordern keinen Code zum Empfangen oder Verarbeiten von Abfragebenachrichtigungen. Wenn das Benachrichtigungsabonnement von einem SqlDependency-Objekt verwaltet wird, überwacht das Objekt das Abonnement automatisch. Sobald eine Benachrichtigungsmeldung eintrifft, ruft das SqlDependency-Objekt den in dem SqlDependency-Objekt registrierten Ereignishandler auf. Auf diese Weise braucht nichts Spezielles unternommen werden, um die Benachrichtigung zu empfangen. Wenn eine Anwendung SqlDependency verwendet, braucht sie keine Benachrichtigungsmeldungen zu empfangen oder zu verarbeiten.

Wenn die Anwendung jedoch eine Benachrichtigungsanforderung verwendet, muss sie die Warteschlange überwachen und auf Benachrichtigungsmeldung reagieren. In diesem Fall müssen Sie eine Anwendung zum Verarbeiten der Nachrichten für den die Benachrichtigungen empfangenden Dienst schreiben. Es kann sich bei der Anwendung, die die Benachrichtigung anfordert, und derjenigen, die die Benachrichtigungsmeldung verarbeitet, um dieselbe Anwendung handeln; Sie können aber auch eine andere Anwendung schreiben, um die Abfragebenachrichtigungsmeldungen zu empfangen und darauf zu reagieren.

SQL Server verfolgt Benachrichtigungsabonnements mithilfe einer Kombination aus Benachrichtungs-ID und der eigentlichen, übermittelten Abfrage. Wenn eine Anwendung eine Benachrichtigung für zwei verschiedene Abfragen anfordert, die jedoch dieselbe Benachrichtigungs-ID verwenden, erstellt SQL Server zwei Abonnements mit derselben Benachrichtigungs-ID. Wenn eine Anwendung jedoch zwei Mal eine Benachrichtigung für dieselbe Abfrage mit derselben Benachrichtigungs-ID anfordert, erstellt SQL Server ein einziges Abonnement, wobei das Timeout in der zweiten Anforderung angegeben ist.

Bei in der Datenbank ausgeführten Anwendungen handelt es sich normalerweise um gespeicherte Prozeduren, die beim Eintreffen einer Nachricht von der Warteschlange aktiviert werden. Diese gespeicherten Prozeduren können entweder in Transact-SQL oder in einer der .NET-Sprachen geschrieben werden. Andere, weniger gebräuchliche Verfahren bestehen u. a. darin, die Anwendung als geplanten Auftrag auszuführen, oder einen Starttask zu verwenden, um eine gespeicherte Prozedur fortlaufend im Hintergrund auszuführen.

Anwendungen, die außerhalb der Datenbank ausgeführt werden, verwenden normalerweise eine der folgenden Vorgehensweisen zum Empfangen von Nachrichten:

  • Die Anwendung ruft die Warteschlange in regelmäßigen Abständen auf, um zu ermitteln, ob Nachrichten eingetroffen sind.

  • Die Anwendung verwendet die WAITFOR-Klausel der RECEIVE-Anweisung, um das Ausführen eines Batches oder einer gespeicherten Prozedur für eine RECEIVE-Anweisung zu blockieren, bis die Anweisung mindestens eine Zeile zurückgibt.

  • Die Anwendung erstellt eine Ereignisbenachrichtigung für das QUEUE_ACTIVATION-Ereignis für die Warteschlange, die die Benachrichtigung empfängt. So kann die Anwendung den Dienst, der das Aktivierungsereignis empfängt, mithilfe einer der oben beschriebenen Strategien überwachen.

Andere, weniger gebräuchliche Verfahren bestehen u. a. darin, die Warteschlangenaktivierung mithilfe von WMI zu überwachen, oder eine CLR-gespeicherte Prozedur (Common Language Runtime, CLR) zu schreiben, die als Antwort auf eine Nachricht bestimmte externe Aktionen auslöst.

Da Abfragebenachrichtigungsdialoge immer nur eine einzige Benachrichtigungsmeldung enthalten, muss eine Benachrichtigungsmeldungen verarbeitende Anwendung die Konversation nach dem Empfangen einer Nachricht beenden. Anderenfalls kommt es zu einem Timeout des Dialogs. Bei einem Timeout des Abfragebenachrichtigungsdialogs protokolliert SQL Server den Dialogtimeoutfehler im SQL Server-Fehlerprotokoll.

Weitere Informationen zum Schreiben einer Anwendung, die Service Broker verwendet, finden Sie unter Vorteile der Programmierung mit Service Broker. Weitere Informationen zum Starten einer Anwendung, die Service Broker verwendet, finden Sie unter Auswählen einer Startstrategie.