Lektion 2: Starta en konversation och skicka meddelanden

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

I den här lektionen får du lära dig att starta en konversation, slutföra en enkel meddelandecykel för begäran och svara och sedan avsluta konversationen.

Procedurer

Notis

Kodexemplen i den här artikeln har testats med hjälp av AdventureWorks2025 exempeldatabas som du kan ladda ned från Microsoft SQL Server-exempel och Community Projects startsida.

Växla till databasen AdventureWorks2008R2

  • Kopiera och klistra in följande kod i ett frågeredigerarefönster och kör den sedan för att växla kontext till databasen AdventureWorks2008R2.

    USE AdventureWorks2008R2;
    GO
    

Starta en konversation och skicka ett meddelande om begäran

  • Kopiera och klistra in följande kod i ett frågeredigerarefönster och kör den sedan för att starta en konversation och skicka ett begärandemeddelande till AWDB/1DBSample/TargetService. Du måste köra koden 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. Det skapar ett begärandemeddelande och använder sedan dialoghandtaget i en SEND -instruktion för att skicka begärandemeddelandet i 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 [//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
    

Ta emot begäran och skicka ett svar

  • Kopiera och klistra in följande kod i ett frågeredigerarefönster och kör den sedan för att ta emot svarsmeddelandet TargetQueue1DB från och skicka tillbaka ett svarsmeddelande till initieraren. -instruktionen RECEIVE hämtar begärandemeddelandet. Följande SELECT instruktion visar texten så att du kan kontrollera att det är samma meddelande som skickades i det sista steget. 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. -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 TargetQueue1DB),
    TIMEOUT 1000;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName = N'//AWDB/1DBSample/RequestMessage'
        BEGIN
            DECLARE @ReplyMsg AS 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
    

Ta emot svaret och avsluta konversationen

  • Kopiera och klistra in följande kod i ett frågeredigerarefönster och kör den sedan för att ta emot svarsmeddelandet och avsluta konversationen. -instruktionen RECEIVE hämtar svarsmeddelandet från InitiatorQueue1DB. 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 InitiatorQueue1DB),
    TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

Nästa steg

Du har slutfört en meddelandecykel för begäran och svar mellan AWDB/1DBSample/InitiatorService och AWDB/1DBSample/TargetService. Du kan upprepa stegen i den här lektionen så många gånger som du vill överföra ett par meddelanden med begärandesvar. När du är klar med att undersöka SEND instruktionerna och REPLY kan du släppa alla objekt som användes av konversationen.