我有一個SSBS隊列,主進程發送M
消息到隊列。有N
子進程逐個獲取消息並處理它們。處理完所有消息後,子流程將退出。現在我做以下,停止隊列的N個用戶
方法1:
主要通道發送的消息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
是否有一個很好的實現方法?
更新:
子流程將執行以下步驟。
- 接收一個消息
- 如果「工作」,
- 過程中的信息(可能需要幾分鐘)
- 發送「信息」消息隊列信息主要工序中的消息一直處理
- 如果 「EndOfData」,
- 發送一條消息 「退出」 主處理
- 接收的
https://..../EndDialog
「存在」 的消息,並退出
- 如果在2.2發送的消息
https://.../EndDialog
,只是接受它