Condividi tramite


Lezione 2: Creazione di una procedura ad attivazione interna

In questa lezione verranno descritte le procedure per creare una stored procedure per l'elaborazione di messaggi provenienti da una coda di Service Broker. Verrà inoltre descritto come specificare che la procedura deve essere attivata ogni volta che sono presenti messaggi nella coda.

Procedure

Passaggio al database AdventureWorks2008R2

  • Copiare e incollare il codice seguente in una finestra dell'editor di query. Eseguire quindi il codice per cambiare contesto passando al database AdventureWorks2008R2.

    USE AdventureWorks2008R2;
    GO
    

Creare una stored procedure di attivazione interna

  • Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per creare una stored procedure. Quando viene eseguita, la stored procedure riceve messaggi fino a quando nella coda sono presenti messaggi. Se si verifica un timeout di ricezione senza restituzione di messaggi, la stored procedure viene terminata. Se il messaggio ricevuto è un messaggio di richiesta, la stored procedure restituisce un messaggio di risposta. Se il messaggio ricevuto è di tipo EndDialog, la stored procedure termina il lato di destinazione della conversazione. Se il messaggio ricevuto è di tipo Error, viene eseguito il rollback della transazione.

    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
    

Modifica della coda di destinazione per specificare l'attivazione interna

  • Copiare e incollare il codice seguente in una finestra dell'editor di query, quindi eseguirlo per specificare che Service Broker deve attivare la stored procedure TargetActiveProc per elaborare i messaggi provenienti da TargetQueueIntAct. Service Broker eseguirà una copia di TargetActiveProc ogni volta che viene ricevuto un messaggio in TargetQueueIntAct, purché nessuna copia della procedura sia già in esecuzione. Service Broker aggiungerà quindi altre copie di TargetActiveProc ogni volta che le copie esistenti non riescono a gestire il numero di messaggi in arrivo.

    ALTER QUEUE TargetQueueIntAct
        WITH ACTIVATION
        ( STATUS = ON,
          PROCEDURE_NAME = TargetActivProc,
          MAX_QUEUE_READERS = 10,
          EXECUTE AS SELF
        );
    GO
    

Passaggi successivi

È stato configurato correttamente AdventureWorks2008R2 per supportare una conversazione tra //AWDB/InternalAct/InitiatorService e //AWDB/InternalAct/TargetService. Nel passaggio successivo si completerà una conversazione tramite la configurazione. Vedere Lezione 3: Inizio di una conversazione e trasmissione di messaggi.