第 4 课:开始对话并传输消息

适用于SQL ServerAzure SQL 托管实例

在本课中,你将学习如何启动一个会话,该对话跨同一个数据库引擎实例中的两个数据库。 你还将了解如何完成简单的请求-回复消息周期,然后结束对话。

过程

切换到 InitiatorDB 数据库

  • 将以下代码复制并粘贴到查询编辑器窗口中,然后运行它,将上下文切换到启动会话的 InitiatorDB 数据库。

    USE InitiatorDB;
    GO
    

启动会话并发送请求消息

  • 将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它以启动会话,并将请求消息发送到 TargetDB 中的 TgtDB/2DBSample/TargetService 代码必须在一个块中运行,因为变量用于将对话句柄从 BEGIN DIALOG 语句传递到 SEND 语句。 批处理运行 BEGIN DIALOG 语句以开始会话并生成请求消息。 然后,它使用语句中的 SEND 对话句柄在该会话上发送请求消息。 最后 SELECT 一条语句显示已发送的消息的文本。

    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
    

切换到 TargetDB 数据库

  • 复制以下代码并将其粘贴到查询编辑器窗口中。 然后,运行它以将上下文 TargetDB 切换到接收请求消息的数据库,并将回复消息发送回该 InitiatorDB数据库。

    USE TargetDB;
    GO
    

接收请求并发送答复

  • 将以下代码复制并粘贴到“查询编辑器”窗口中,然后运行它以从 TargetQueue2DB 接收回复消息,并将回复消息发送回发起方。 该 RECEIVE 语句检索请求消息。 然后,以下 SELECT 语句显示文本,以便可以验证它是否与上一步中发送的消息相同。 该 IF 语句测试收到的消息是否为请求消息类型,以及是否 SEND 使用语句将答复消息发送回发起程序。 它还测试该语句是否 END CONVERSATION 用于结束对话的目标端。 最后 SELECT 一条语句显示答复消息的文本。

    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
    

切换到 InitiatorDB 数据库

  • 复制以下代码并将其粘贴到查询编辑器窗口中。 然后,运行它,将上下文切换回接收回复消息并结束对话的 InitiatorDB 数据库。

    USE InitiatorDB;
    GO
    

接收答复并结束会话

  • 复制以下代码并将其粘贴到查询编辑器窗口中。 然后,运行代码来接收答复消息并结束会话。 该 RECEIVE 语句从 InitiatorQueue2DB 检索回复消息。 该 END CONVERSATION 语句结束会话的发起方。 最后 SELECT 一条语句显示答复消息的文本,以便可以确认它与上一步中发送的内容相同。

    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