Lektion 2: Erstellen einer Prozedur für die interne Aktivierung
In dieser Lektion erfahren Sie, wie Sie eine gespeicherte Prozedur zum Verarbeiten von Nachrichten aus einer Service Broker-Warteschlange erstellen. Außerdem erfahren Sie, wie Sie angeben, dass die Prozedur immer dann aktiviert werden soll, wenn sich Nachrichten in der Warteschlange befinden.
Verfahrensweisen
Wechseln zur AdventureWorks2008R2-Datenbank
Kopieren Sie den folgenden Code, und fügen Sie ihn in einem Abfrage-Editor-Fenster ein. Führen Sie den Code anschließend aus, um den Kontext zur AdventureWorks2008R2-Datenbank zu wechseln.
USE AdventureWorks2008R2; GO
Erstellen einer gespeicherten Prozedur für die interne Aktivierung
Kopieren Sie den folgenden Code, und fügen Sie ihn in einem Abfrage-Editorfenster ein. Führen Sie den Code anschließend aus, um eine gespeicherte Prozedur zu erstellen. Wenn der Code ausgeführt wird, führt die gespeicherte Prozedur so lange Empfangsvorgänge aus, wie Nachrichten in der Warteschlange vorhanden sind. Wenn das Timeout für den Empfang eintritt, ohne dass eine Nachricht zurückgegeben wird, wird die gespeicherte Prozedur beendet. Wenn die empfangene Nachricht eine Anforderungsnachricht war, gibt die gespeicherte Prozedur eine Antwortnachricht zurück. Wenn die empfangene Nachricht eine EndDialog-Nachricht ist, beendet die gespeicherte Prozedur die Zielseite der Konversation. Wenn die empfangene Nachricht eine Error-Nachricht ist, wird für die Transaktion ein Rollback ausgeführt.
CREATE PROCEDURE TargetActivProc AS DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER; DECLARE @RecvReqMsg NVARCHAR(100); DECLARE @RecvReqMsgName sysname; WHILE (1=1) BEGIN BEGIN TRANSACTION; WAITFOR ( RECEIVE TOP(1) @RecvReqDlgHandle = conversation_handle, @RecvReqMsg = message_body, @RecvReqMsgName = message_type_name FROM TargetQueueIntAct ), TIMEOUT 5000; IF (@@ROWCOUNT = 0) BEGIN ROLLBACK TRANSACTION; BREAK; END IF @RecvReqMsgName = N'//AWDB/InternalAct/RequestMessage' BEGIN DECLARE @ReplyMsg NVARCHAR(100); SELECT @ReplyMsg = N'<ReplyMsg>Message for Initiator service.</ReplyMsg>'; SEND ON CONVERSATION @RecvReqDlgHandle MESSAGE TYPE [//AWDB/InternalAct/ReplyMessage] (@ReplyMsg); END ELSE IF @RecvReqMsgName = N'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog' BEGIN END CONVERSATION @RecvReqDlgHandle; END ELSE IF @RecvReqMsgName = N'https://schemas.microsoft.com/SQL/ServiceBroker/Error' BEGIN END CONVERSATION @RecvReqDlgHandle; END COMMIT TRANSACTION; END GO
Ändern der Zielwarteschlange, um die interne Aktivierung anzugeben
Kopieren Sie den folgenden Code, und fügen Sie ihn in einem Abfrage-Editorfenster ein. Führen Sie den Code anschließend aus, um anzugeben, dass Service Broker die gespeicherte Prozedur TargetActiveProc aktivieren soll, um Nachrichten aus TargetQueueIntAct zu verarbeiten. Service Broker führt immer dann eine Kopie von TargetActiveProc aus, wenn eine Nachricht in TargetQueueIntAct empfangen wird und noch keine Kopie der Prozedur ausgeführt wird. Service Broker führt immer dann zusätzliche Kopien von TargetActiveProc aus, wenn die vorhandenen Kopien für die Anzahl der eingehenden Nachrichten nicht mehr ausreichen.
ALTER QUEUE TargetQueueIntAct WITH ACTIVATION ( STATUS = ON, PROCEDURE_NAME = TargetActivProc, MAX_QUEUE_READERS = 10, EXECUTE AS SELF ); GO
Nächste Schritte
Sie haben AdventureWorks2008R2 erfolgreich konfiguriert, um eine Konversation zwischen dem //AWDBInternalAct/InitiatorService und dem //AWDB/InternalAct/TargetService zu unterstützen. Anschließend schließen Sie eine Konversation ab, die diese Konfiguration verwendet. Siehe Lektion 3: Starten einer Konversation und Übertragen von Nachrichten.