gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:44:24 24 4
gpt4 key购买 nike

我正在学习 SQL Server Service Broker 作为协调异步任务的工具。假设我有一个 MasterService,它结合了来自 EmployeeInfoServicePayrollInfoService 的数据。我得到一个 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?

最佳答案

Now I need to wait till both conversations are done.

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

因此在您的情况下,您将过程与 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 中公开它取决于具体情况。但想想断开连接、松散耦合、非交互式服务。

关于sql-server - 等待 SQL Server Service Broker 中的异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19846375/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com