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

新建日期: 2007 年 9 月 15 日

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

过程

切换到 InitiatorDB 数据库

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

    USE InitiatorDB;
    GO
    

启动会话并发送请求消息

  1. 复制以下代码并粘贴至查询编辑器窗口中。 然后,运行该代码以启动会话并向 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 数据库

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

    USE TargetDB;
    GO
    

接收请求并发送答复

  1. 复制以下代码并粘贴至查询编辑器窗口中。 然后,运行该代码以从 TargetQueue2DB 中接收答复消息并将答复消息发回至发起方。 RECEIVE 语句可检索请求消息。 然后,下面的 SELECT 语句可显示文本以使您可以验证该文本是否为前一步中发送的同一消息。 IF 语句可检测接收的消息是否为某个请求消息类型,以及是否使用 SEND 语句将答复消息发送回发起方。 此外,它还检测是否使用了 END CONVERSATION 语句结束会话的目标一端。 最后的 SELECT 语句用于显示答复消息的文本。

    DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RecvReqMsg NVARCHAR(100);
    DECLARE @RecvReqMsgName sysname;
    
    BEGIN TRANSACTION;
    
    RECEIVE TOP(1)
        @RecvReqDlgHandle = conversation_handle,
        @RecvReqMsg = message_body,
        @RecvReqMsgName = message_type_name
    FROM TargetQueue2DB;
    
    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 数据库

  1. 复制以下代码并粘贴至查询编辑器窗口中。 然后,运行该代码以将上下文切换回 InitiatorDB 数据库,在其中您将收到答复消息并结束会话。

    USE InitiatorDB;
    GO
    

接收答复并结束会话

  1. 复制以下代码并粘贴至查询编辑器窗口中。 然后,运行该代码以接收答复消息并结束该会话。 RECEIVE 语句可检索来自 InitiatorQueue2DB 的答复消息。 END CONVERSATION 语句用于结束会话的发起方一端。 最后的 SELECT 语句将显示答复消息的文本,以使您可以确认它是否与上一步骤中发送的消息相同。

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

后续步骤

本步骤将结束此教程。 这些教程仅是简单的概述性教程,并未介绍所有可用的选项。 教程中的逻辑和错误处理进行了简化,以便更好地将注意力放在基本操作上。 若要创建高效、可靠和健壮的会话,您需要编写比本教程中的示例更加复杂的代码。

返回 Service Broker 教程

Service Broker 教程

请参阅

其他资源

BEGIN DIALOG CONVERSATION (Transact-SQL)
END CONVERSATION (Transact-SQL)
RECEIVE (Transact-SQL)
SEND (Transact-SQL)
WAITFOR (Transact-SQL)
Service Broker Programming Basics

帮助和信息

获取 SQL Server 2005 帮助