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

在本课中,您将学习在配置有内部激活存储过程的系统中完成简单的请求-答复消息循环。

过程

切换到 AdventureWorks 数据库

  • 复制以下代码并将其粘贴到查询编辑器窗口中。然后,运行该代码以将上下文切换到 AdventureWorks 数据库。

    USE AdventureWorks;
    GO
    

启动会话并发送请求消息

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

    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;
    DECLARE @RequestMsg NVARCHAR(100);
    
    BEGIN TRANSACTION;
    
    BEGIN DIALOG @InitDlgHandle
         FROM SERVICE
          [//AWDB/InternalAct/InitiatorService]
         TO SERVICE
          N'//AWDB/InternalAct/TargetService'
         ON CONTRACT
          [//AWDB/InternalAct/SampleContract]
         WITH
             ENCRYPTION = OFF;
    
    -- Send a message on the conversation
    SELECT @RequestMsg =
           N'<RequestMsg>Message for Target service.</RequestMsg>';
    
    SEND ON CONVERSATION @InitDlgHandle
         MESSAGE TYPE 
         [//AWDB/InternalAct/RequestMessage]
         (@RequestMsg);
    
    -- Diplay sent request.
    SELECT @RequestMsg AS SentRequestMsg;
    
    COMMIT TRANSACTION;
    GO
    

接收请求并发送答复

  • 发送请求消息时,Service Broker 会自动激活一个 TargetActiveProc 的副本。存储过程会从 TargetQueueIntAct 接收该请求消息,并向发起方发送回一条回复消息。

接收答复并结束会话

  • 复制以下代码并将其粘贴到查询编辑器窗口中。然后,运行代码来接收答复消息并结束会话。RECEIVE 语句检索来自 InitiatorQueueIntAct 的答复消息。END CONVERSATION 语句在发起方结束会话,并向目标服务发送一条 EndDialog 消息。最后一条 SELECT 语句显示答复消息的文本,以便您确认它是否与上一步中发送的消息相同。

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

在会话的目标方结束会话

  • 为发起方运行 END CONVERSATION 语句时,Service Broker 会向 TargetQueueIntAct 队列发送一条 EndDialog 消息。TargetActiveProc 过程接收该 EndDialog 消息,并会运行一个在目标方结束会话的 END CONVERSATION 语句。

后续步骤

您已经成功完成了 //AWDB/InternalAct/InitiatorService//AWDB/InternalAct/TargetService 之间的请求-答复消息循环。您可以自由多次重复本课中的步骤来传输请求-答复消息对。当您了解了 SEND 和 REPLY 语句后,便可删除该会话使用的所有对象。有关详细信息,请参阅第 4 课:删除会话对象