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 AdventureWorks-Datenbank

  • Kopieren Sie den folgenden Code, und fügen Sie ihn in einem Abfrage-Editorfenster ein. Führen Sie den Code anschließend aus, um den Kontext zur AdventureWorks-Datenbank zu wechseln.

    USE AdventureWorks;
    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 AdventureWorks erfolgreich konfiguriert, um eine Konversation zwischen dem //AWDB/InternalAct/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.