第 4 课:启动会话并传输消息

在本课中,您将学习启动一个跨越同一数据库引擎实例中的两个数据库的会话。您还将学习如何完成一个简单的请求-答复消息循环,然后结束会话。

过程

切换到 InitiatorDB 数据库

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

    USE InitiatorDB;
    GO
    

启动会话并发送请求消息

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

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg 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 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 TargetQueue2DB
    ), TIMEOUT 1000;
    
    SELECT @RecvReqMsg AS ReceivedRequestMsg;
    
    IF @RecvReqMsgName =
       N'//BothDB/2DBSample/RequestMessage'
    BEGIN
         DECLARE @ReplyMsg 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 NVARCHAR(100);
    DECLARE @RecvReplyDlgHandle UNIQUEIDENTIFIER;
    
    BEGIN TRANSACTION;
    
    WAITFOR
    ( RECEIVE TOP(1)
        @RecvReplyDlgHandle = conversation_handle,
        @RecvReplyMsg = message_body
      FROM InitiatorQueue2DB
    ), TIMEOUT 1000;
    
    END CONVERSATION @RecvReplyDlgHandle;
    
    -- Display recieved request.
    SELECT @RecvReplyMsg AS ReceivedReplyMsg;
    
    COMMIT TRANSACTION;
    GO
    

后续步骤

本步骤将结束教程。 教程只是简要的概述, 并不能说明所有可能的情况。 教程使用的是简化的逻辑和错误处理方法,不应用于生产环境。若要创建高效、可靠和强健的会话,您需要比教程中的示例更为复杂的代码。

返回 Service Broker 教程

Service Broker 教程