BizTalk Server 中的 Zombie
何謂 Zombie?
Zombie (廢止) 訊息是從 MessageBox 經路由送往執行中協調流程、但是當該協調流程結束時仍「在途中」的訊息。 「在途中」訊息是已經路由送往服務執行個體,然後即處於該服務執行個體之 MessageBox 佇列中的訊息。 因為訂閱的協調流程執行個體可能不再取用該訊息,所以會擱置此訊息,並以「擱置 (不可繼續)」的 ServiceInstance/State 值標示它。
Zombie 服務執行個體是當訊息從 MessageBox 經路由前往協調流程執行個體且仍「在途中」時,即已完成的協調流程執行個體。 由於協調流程執行個體已經結束,它便無法取用這個「在途中」訊息,因此訊息會遭到擱置,並且標示「擱置 (不可繼續)」的 ServiceInstance/State 值。
一般原因
發生 Zombie 的狀況通常分成以下類別:
終止控制訊息 – 協調流程引擎允許使用控制訊息來取消特定協調流程實例中目前正在執行的所有工作。 由於控制訊息會立即停止執行中的協調流程,所以產生 Zombie 執行個體一點也不意外。 有許多與「人力工作流程」相關的設計經常使用這種機制,而其他某些設計也會採用。
平行接聽接收 – 在此案例中,服務實例會等候 1 個 n 個訊息,以及收到某些訊息時,它會執行一些工作並終止。 如果正好於服務執行個體終止時,在平行分支上收到訊息,便會產生 Zombie。
具有不具決定性端點的循序連絡 – 在此案例中,主要協調流程排程的設計目的是要處理特定類型的所有訊息,以符合某種類型的系統設計需求。 這些設計需求可能包括有序傳遞、資源分配程式和批次處理。 就此實例而言,比較傾向於定義環繞「待命」的 While 迴圈,而此待命帶有一個含「接收」的分支以及另一個帶有延遲圖形 (其後連接某個用來設定某變數以指示 While 迴圈停止的建構) 的分支。 因為這可能觸發延遲,所以是非決定性的,但卻仍然會傳遞該訊息。 像這樣的非決定性端點就很容產生 Zombie。
當 zombie 服務實例暫停時,會產生下列錯誤訊息:
0xC0C01B4C The instance completed without consuming all of its messages. The instance and its unconsumed messages have been suspended.
您可以使用 BizTalk 結束字元 來協助移除Zombies。
另請參閱
在UI 指引和開發人員 API 命名空間參考中移除暫停的服務實例