2013-01-04 36 views
0

我有一個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 

是否有一個很好的實現方法?

更新:
子流程將執行以下步驟。

  1. 接收一個消息
  2. 如果「工作」,
    1. 過程中的信息(可能需要幾分鐘)
    2. 發送「信息」消息隊列信息主要工序中的消息一直處理
  3. 如果 「EndOfData」,
    1. 發送一條消息 「退出」 主處理
    2. 接收的https://..../EndDialog 「存在」 的消息,並退出
  4. 如果在2.2發送的消息https://.../EndDialog,只是接受它

回答

1

還有一個辦法,假設N = 3

  1. 發送包含3的「EndOfData」類型的消息。
  2. 其中3個子進程收到此消息,發送包含2的響應消息,退出。所以2個運行子流程就離開了。
  3. 2接收響應併發送包含2的「EndOfData」類型的消息。
  4. 其中2個子過程收到此消息,發送包含1的響應消息,退出。所以剩下1個正在運行的子流程。
  5. 1接收響應併發送包含1的「EndOfData」類型的消息。
  6. 上次運行的子進程收到此消息,發送包含0的響應消息,退出。沒有運行子流程。
  7. 0接收響應並停止發送「EndOfData」類型的消息。