Lektion 4: Starta en konversation och skicka meddelanden

gäller för:SQL ServerAzure SQL Managed Instance

I den här lektionen lär du dig att starta en konversation som sträcker sig över två databaser i samma instans av databasmotorn. Du får också lära dig hur du slutför en enkel meddelandecykel för begärandesvar och sedan avslutar konversationen.

Procedures

Växla till InitiatorDB-databasen

  • Kopiera och klistra in följande kod i ett frågeredigerarefönster och kör den sedan för att växla kontext till InitiatorDB-databasen där du initierar konversationen.

    USE InitiatorDB;
    GO
    

Starta en konversation och skicka ett meddelande om begäran

  • Kopiera och klistra in följande kod i ett frågeredigerarefönster, kör den sedan för att starta en konversation och skicka ett begärandemeddelande till TgtDB/2DBSample/TargetService i TargetDB. Koden måste köras i ett block eftersom en variabel används för att skicka ett dialoghandtag från BEGIN DIALOG till -instruktionen SEND . Batchen kör -instruktionen BEGIN DIALOG för att starta konversationen och skapa ett begärandemeddelande. Sedan använder den dialoghandtaget i en SEND -instruktion för att skicka begärandemeddelandet om konversationen. Den sista SELECT instruktionen visar texten i meddelandet som skickades.

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

Växla till TargetDB-databasen

  • Kopiera och klistra in följande kod i ett frågeredigerarefönster. Kör den sedan för att växla kontext till databasen TargetDB där du får begärandemeddelandet och skicka ett svarsmeddelande tillbaka till InitiatorDB.

    USE TargetDB;
    GO
    

Ta emot begäran och skicka ett svar

  • Kopiera och klistra in följande kod i ett frågeredigerarefönster, kör den för att ta emot svarsmeddelandet från TargetQueue2DB och skicka ett svarsmeddelande tillbaka till initieraren. -instruktionen RECEIVE hämtar begärandemeddelandet. SELECT Följande instruktion visar sedan texten så att du kan kontrollera att det är samma meddelande som skickades i föregående steg. Instruktionen IF testar om det mottagna meddelandet är en typ av begärandemeddelande och om en SEND instruktion används för att skicka tillbaka ett svarsmeddelande till initieraren. Den testar också om -instruktionen END CONVERSATION används för att avsluta målsidan av konversationen. Den slutliga SELECT instruktionen visar texten i svarsmeddelandet.

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

Växla till InitiatorDB-databasen

  • Kopiera och klistra in följande kod i ett frågeredigerarefönster. Kör den sedan för att växla tillbaka kontexten till InitiatorDB-databasen där du får svarsmeddelandet och avsluta konversationen.

    USE InitiatorDB;
    GO
    

Ta emot svaret och avsluta konversationen

  • Kopiera och klistra in följande kod i ett frågeredigerarefönster. Kör den sedan för att ta emot svarsmeddelandet och avsluta konversationen. Instruktionen RECEIVE hämtar svarsmeddelandet från InitiatorQueue2DB. Instruktionen END CONVERSATION avslutar initierarsidan av konversationen. Den sista SELECT instruktionen visar texten i svarsmeddelandet så att du kan bekräfta att det är samma som det som skickades i föregående steg.

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