等待SQL Server Service Broker中的异步任务

时间:2013-11-07 20:47:55

标签: sql-server service-broker

我正在学习SQL Server Service Broker作为协调异步任务的工具。假设我有一个MasterService,它结合了EmployeeInfoServicePayrollInfoService的数据。我得到一个EmployeeIDs列表,然后将每个作为对话发送给两个服务。在这两个服务的末尾是激活sproc,它将一次处理两个EmployeeIDs

几个问题

  1. 如何将每位员工的回复存储到MasterService内的临时表中?
  2. 我怎么知道这两个服务已经处理了所有EmployeeIDs所以我可以从我在步骤#1中构建的两个临时表中生成数据?
  3. 到目前为止,这是我的代码:

    -- Get a whole bunch of EmployeeIDs
    
    DECLARE @EmployeeConversation   uniqueidentifier
    DECLARE @PayrollConversation    uniqueidentifier
    
    BEGIN DIALOG @EmployeeConversation
        FROM SERVICE    MasterService
        TO SERVICE      'EmployeeInfoService';
    
        SEND ON CONVERSATION @EmployeeConversation MESSAGE (EmployeeID1)
        SEND ON CONVERSATION @EmployeeConversation MESSAGE (EmployeeID2)
        SEND ON CONVERSATION @EmployeeConversation MESSAGE (Employee...);
    
    BEGIN DIALOG @PayrollConversation
        FROM SERVICE    MasterService
        TO SERVICE      'PayrollInfoService'
        WITH RELATED_CONVERSATION_GROUP = @EmployeeConversation;
    
        SEND ON CONVERSATION @PayrollConversation MESSAGE (EmployeeID1)
        SEND ON CONVERSATION @PayrollConversation MESSAGE (EmployeeID2)
        SEND ON CONVERSATION @PayrollConversation MESSAGE (Employee...);
    
    -- Now I need to wait till both conversations are done.
    -- How do I handle that?
    

1 个答案:

答案 0 :(得分:3)

  

现在我需要等到两个对话完成。

不,不。这是面向消息的编程最重要的部分:你永远不会等待来获得响应。响应可能会在一秒内发生,也可能在一周内发生。你做的是你完成处理,这就完成了。当响应来自服务时,您将被激活并处理响应。

因此,在您的情况下,您将过程与MasterService队列关联:

create procedure usp_masterService
as
begin transaction
receive message_body, messge_type from MasterServiceQueue;
if message_type = 'EmployeeInfoMessage' then
   insert or update into stateTable info from message body;
if message_type = 'PayrollInfoMessgae' then
   insert or update into stateTable info from message body;
if allResponsesReceived
   do something
...
commit

alter queue MasterServiceQueue with activation (procedure usp_masterService);

如何处理与员工信息请求相关联的状态以及如何检测“收到的所有响应”完全是业务逻辑。但是你不能使用临时表,响应将由各种线程上的各种事务处理(激活的触发器),最重要的是,它们可能会在服务器重启处理

当'PayrollInfoService'是远程的(在另一台机器上)并且正在进行6小时维护时,您的流程必须优雅地处理。你的回应会来,但需要6个小时。如何在应用程序UI中公开它将取决于具体情况。但想想断开连接,松散耦合的非交互式服务。