Condividi tramite


Lezione 3: Inizio di una conversazione e trasmissione di messaggi

In questa lezione verranno descritte le procedure per completare un ciclo di messaggi semplice di tipo richiesta-risposta in un sistema configurato con una stored procedure di attivazione interna.

Procedure

Passaggio al database AdventureWorks2008R2

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

    USE AdventureWorks2008R2;
    GO
    

Inizio di una conversazione e invio di un messaggio di richiesta

  • Copiare e incollare il codice seguente in una finestra dell'editor di query. Eseguire quindi il codice per avviare una conversazione e inviare un messaggio di richiesta a //AWDB/InternalAct/TargetService. Il codice deve essere eseguito in un blocco, in quanto viene utilizzata una variabile per passare un handle di dialogo dall'istruzione BEGIN DIALOG all'istruzione SEND. Il batch esegue l'istruzione BEGIN DIALOG per avviare la conversazione. Il batch compila un messaggio di richiesta, quindi utilizza l'handle di dialogo in un'istruzione SEND per inviare il messaggio di richiesta sulla conversazione. L'ultima istruzione SELECT visualizza il testo del messaggio inviato.

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg NVARCHAR(100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
         FROM SERVICE
          [//AWDB/InternalAct/InitiatorService]
         TO SERVICE
          N'//AWDB/InternalAct/TargetService'
         ON CONTRACT
          [//AWDB/InternalAct/SampleContract]
         WITH
             ENCRYPTION = OFF;
    
    -- Send a message on the conversation
    SELECT @RequestMsg =
           N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE 
         [//AWDB/InternalAct/RequestMessage]
         (@RequestMsg);
    
    -- Diplay sent request.
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

Ricezione della richiesta e invio di una risposta

  • Quando si invia il messaggio di richiesta, Service Broker attiva automaticamente una copia di TargetActiveProc. La stored procedure riceve il messaggio di risposta da TargetQueueIntAct e invia un messaggio di risposta all'initiator.

Ricezione della risposta e fine della conversazione

  • Copiare e incollare il codice seguente in una finestra dell'editor di query. Eseguire quindi il codice per ricevere il messaggio di risposta e terminare la conversazione. L'istruzione RECEIVE recupera il messaggio di risposta da InitiatorQueueIntAct. L'istruzione END CONVERSATION termina il lato dell'initiator della conversazione e invia un messaggio EndDialog al servizio di destinazione. L'ultima istruzione SELECT visualizza il testo del messaggio di risposta per consentire di verificare che si tratti dello stesso messaggio inviato nel passaggio precedente.

    DECLARE @RecvReplyMsg NVARCHAR(100);
    DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
    BEGIN TRANSACTION;
    
    WAITFOR
    ( RECEIVE TOP(1)
        @RecvReplyDlgHandle = conversation_handle,
        @RecvReplyMsg = message_body
        FROM InitiatorQueueIntAct
    ), TIMEOUT 5000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Termine del lato destinazione della conversazione.

  • Quando si esegue l'istruzione END CONVERSATION per l'initiator, Service Broker invia un messaggio EndDialog alla coda TargetQueueIntAct. La procedura TargetActiveProc riceve il messaggio EndDialog e invia un'istruzione END CONVERSATION che termina il lato destinazione della conversazione.

Passaggi successivi

È stato completato correttamente un ciclo di messaggi di richiesta-risposta tra //AWDB/InternalAct/InitiatorService e //AWDB/InternalAct/TargetService. È possibile ripetere i passaggi di questa lezione tutte le volte che lo si desidera per trasmettere una coppia di messaggi richiesta-risposta. Dopo avere controllato le istruzioni SEND e REPLY, è possibile eliminare tutti gli oggetti utilizzati dalla conversazione. Per ulteriori informazioni, vedere Lezione 4: Eliminazione degli oggetti di conversazione.