【发布时间】:2013-01-04 17:52:50
【问题描述】:
我有一个 SSBS 队列和一个主进程将 M 消息发送到队列。有N 子进程一一获取消息并处理它们。处理完所有消息后,子进程将退出。现在我正在做以下事情,
方法一:
主进程在发送M消息后发送N“EndOfData”。但是它不能很好地工作,因为某些子流程可能会收到多个“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
有没有好的实现方法?
更新:
子流程将执行以下步骤。
- 收到一条消息
- 如果“工作”,
- 处理消息(可能需要几分钟)
- 向队列发送“Info”消息,以告知主进程消息已被处理
- 如果“EndOfData”,
- 向主进程发送消息“退出”
- 收到“Exist”消息的
https://..../EndDialog并退出
- 如果
https://.../EndDialog2.2 发送的消息,直接接收即可
【问题讨论】:
标签: sql-server-2008 service-broker