Lezione 2: Inizio di una conversazione e trasmissione di messaggi

Si applica a:SQL ServerIstanza gestita di SQL di Azure

In questa lezione si apprenderà come avviare una conversazione, completare un semplice ciclo di messaggi di richiesta-risposta e quindi terminare la conversazione.

Procedure

Nota

Gli esempi sono stati convalidati in SQL Server 2008 R2 (10.50.x). Per completare gli esempi, è consigliabile usare il database di esempio AdventureWorks2008R2 dai database di esempio AdventureWorks.

SQL Server Service Broker è supportato nella versione corrente di SQL Server.

Passare al database AdventureWorks2008R2

  • Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Eseguirlo quindi per cambiare contesto passando al database AdventureWorks2008R2.

        USE AdventureWorks2008R2;
        GO
    

Avviare una conversazione e inviare un messaggio di richiesta

  • Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Eseguirlo quindi per avviare una conversazione e inviare un messaggio di richiesta ad //AWDB/1DBSample/TargetService. Il codice deve essere eseguito in un blocco, perché viene usata una variabile per cambiare l'handle di dialogo dall'istruzione BEGIN DIALOG a SEND. Il batch esegue l'istruzione BEGIN DIALOG per avviare la conversazione. Crea un messaggio di richiesta e quindi usa l'handle di dialogo in un'istruzione SEND per inviare il messaggio di richiesta nella conversazione. L'ultima istruzione SELECT mostra soltanto il testo del messaggio inviato.

        DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
        DECLARE @RequestMsg NVARCHAR(100);
    
        BEGIN TRANSACTION;
    
        BEGIN DIALOG @InitDlgHandle
             FROM SERVICE
              [//AWDB/1DBSample/InitiatorService]
             TO SERVICE
              N'//AWDB/1DBSample/TargetService'
             ON CONTRACT
              [//AWDB/1DBSample/SampleContract]
             WITH
                 ENCRYPTION = OFF;
    
        SELECT @RequestMsg =
               N'<RequestMsg>Message for Target service.</RequestMsg>';
    
        SEND ON CONVERSATION @InitDlgHandle
             MESSAGE TYPE
             [//AWDB/1DBSample/RequestMessage]
             (@RequestMsg);
    
        SELECT @RequestMsg AS SentRequestMsg;
    
        COMMIT TRANSACTION;
        GO
    

Ricevere la richiesta e inviare una riposta

  • Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Eseguire quindi il codice per ricevere il messaggio di risposta da TargetQueue1DB e inviare un messaggio di risposta all'initiator. L'istruzione RECEIVE recupera il messaggio di richiesta. La seguente istruzione SELECT mostra il testo, in modo da poter verificare che sia lo stesso messaggio inviato nell'ultimo passaggio. L'istruzione IF verifica se il messaggio ricevuto è un tipo di messaggio di richiesta e se viene usata un'istruzione SEND per inviare un messaggio di risposta all'iniziatore. L'istruzione END CONVERSATION è usata per terminare il lato di destinazione della conversazione. L'ultima istruzione SELECT mostra il testo del messaggio di risposta.

        DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
        DECLARE @RecvReqMsg NVARCHAR(100);
        DECLARE @RecvReqMsgName sysname;
    
        BEGIN TRANSACTION;
    
        WAITFOR
        ( RECEIVE TOP(1)
            @RecvReqDlgHandle = conversation_handle,
            @RecvReqMsg = message_body,
            @RecvReqMsgName = message_type_name
          FROM TargetQueue1DB
        ), TIMEOUT 1000;
    
        SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
        IF @RecvReqMsgName =
           N'//AWDB/1DBSample/RequestMessage'
        BEGIN
             DECLARE @ReplyMsg NVARCHAR(100);
             SELECT @ReplyMsg =
             N'<ReplyMsg>Message for Initiator service.</ReplyMsg>';
    
             SEND ON CONVERSATION @RecvReqDlgHandle
                  MESSAGE TYPE
                  [//AWDB/1DBSample/ReplyMessage]
                  (@ReplyMsg);
    
             END CONVERSATION @RecvReqDlgHandle;
        END
    
        SELECT @ReplyMsg AS SentReplyMsg;
    
        COMMIT TRANSACTION;
        GO
    

Ricevere la risposta e chiudere la conversazione

  • Copiare il seguente codice e incollarlo nella finestra dell'Editor di query. Quindi, eseguirlo per ricevere il messaggio di risposta e terminare la conversazione. L'istruzione RECEIVE recupera il messaggio di risposta da InitiatorQueue1DB. L'istruzione END CONVERSATION termina il lato iniziatore della conversazione. L'ultima istruzione SELECT visualizza il testo del messaggio di risposta, in modo da poter confermare che è uguale a quello inviato nel passaggio precedente.

        DECLARE @RecvReplyMsg NVARCHAR(100);
        DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
        BEGIN TRANSACTION;
    
        WAITFOR
        ( RECEIVE TOP(1)
            @RecvReplyDlgHandle = conversation_handle,
            @RecvReplyMsg = message_body
          FROM InitiatorQueue1DB
        ), TIMEOUT 1000;
    
        END CONVERSATION @RecvReplyDlgHandle;
    
        SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
        COMMIT TRANSACTION;
        GO
    

Passaggi successivi

È stato completato correttamente un ciclo di messaggio di richiesta-risposta tra //AWDB/1DBSample/InitiatorService e //AWDB/1DBSample/TargetService. È possibile ripetere i passaggi di questa lezione e trasmettere una coppia di messaggi di richiesta-risposta quante volte si desidera. Dopo aver approfondito le istruzioni SEND e REPLY, è possibile eliminare tutti gli oggetti usati dalla conversazione. Per altre informazioni, vedere Lezione 3: Eliminazione degli oggetti di conversazione.

Vedi anche