3

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

几个问题

  1. 如何将每个员工的响应存储到我的临时表中MasterService
  2. 我怎么知道这两个服务已经完成了所有处理EmployeeIDs,所以我可以从我在步骤 #1 中构建的两个临时表中生成数据?

到目前为止,这是我的代码:

-- 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?
4

1 回答 1

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 中公开它取决于具体情况。但是想想不连贯、松散耦合、非交互式的服务。

于 2013-11-09T09:19:34.277 回答