我正在学习SQL Server Service Broker作为协调异步任务的工具。假设我有一个MasterService
,它结合了EmployeeInfoService
和PayrollInfoService
的数据。我得到一个EmployeeIDs
列表,然后将每个作为对话发送给两个服务。在这两个服务的末尾是激活sproc,它将一次处理两个EmployeeIDs
。
几个问题
MasterService
内的临时表中? 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?
答案 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中公开它将取决于具体情况。但想想断开连接,松散耦合的非交互式服务。