我有一个 SSBS 队列和一个主进程向M
队列发送消息。有N
子流程会一一获取消息并进行处理。处理完所有消息后,子进程将退出。现在我正在做以下事情,
方法一:
发送消息后,主进程发送N
“EndOfData” M
。但是它不能很好地工作,因为某些子流程可能会收到多个“EndOfData”消息,因此某些子流程将永远不会收到该消息。
方法2:(扩展方法1)
为每个子流程分配一个 ID,同时在“EndOfData”消息中嵌入一个 ID。如果消息中的 ID 与其 ID 不匹配,则子流程回滚。但是,由于回滚过多并且队列被禁用,它会导致“平衡消息”问题。
begin tran
begin try
WAITFOR(
RECEIVE TOP(1)
@MessageType = message_type_name,
@MessageBody = CAST(message_body AS xml)
FROM
TargetQueue
) , TIMEOUT 1000
if @MessageType = 'EndOfData' and
@MessageBody.value('(//ID/text())[1]', 'int') <> @ID
BEGIN
rollback tran
waitfor delay '00:00:02'
END
有没有好的方法来实现它?
更新:
子流程将执行以下步骤。
- 收到一条消息
- 如果“工作”,
- 处理消息(可能需要几分钟)
- 向队列发送“信息”消息以通知主进程消息已被处理
- 如果 "EndOfData",
- 向主进程发送消息“退出”
- 收到
https://..../EndDialog
“Exist”消息并退出
- 如果
https://.../EndDialog
是 2.2 发送的消息,直接接收