1. 程式人生 > >流程一直處於Running狀態,應該怎麽停止?

流程一直處於Running狀態,應該怎麽停止?

過程 什麽 其中 進程 流程實例 from 構建 啟動 upd

流程一直處於Running狀態,應該怎麽停止?

概述

我們有遇到這種情況:可能由於某些原因,流程發起後一直處於Running狀態,然後我們想Stop掉這些出問題的流程,這個時候你在Workspace裏面進行操作,這個操作是不可能完成的,Workspace也會一直處於Loading狀態。

這種情況下,您唯一的選擇就是通過更新K2 Database來停止這些流程。

在執行這些操作之前,應該嘗試通過Workspace停止流程實例,只有在Workspace處理不了的時候,才去更新K2 Database

在執行操作之前,請熟悉每個狀態的含義,這些狀態可以在[ServerLog].[Status]表找到,它的結構如下:

0 - Error
1 - Running
2 - Active
3 - Completed
4 - Stopped
5 - Deleted
Running狀態的流程實例通常意味著K2服務器仍然在嘗試處理有關WF已構建的操作,此狀態不需要用戶輸入,K2正在嘗試處理待辦生成前的數據。

通過更新 K2 數據庫來停止進程的步驟

在執行以下步驟之前, 請確保 K2 數據庫已經備份,安全第一!

通常有兩種情況下, 您將停止進程實例:

  1. 只是需要停止某些實例, 但它不會讓用戶通過Workspace(將狀態設置為停止4 - Stopped)
  2. 通過調查, 您發現運行的實例會導致 K2 產品的不良行為。(將狀態設置為暫停
    11 - Paused)

方案1

  1. 標識需要停止的運行實例

    SELECT * FROM [K2].[Server].[ProcInst]
    WHERE Status = 1
  2. 確定是否需要停止所有這些進程實例, 或僅對其中的某個子集進行停止。

    /**為某一流程運行實例。可以從[Server].[ProcSet]表中抓取進程 ID**/
    SELECT * FROM [K2].[Server].[ProcInst]
    WHERE ProcID = 3
  3. 運行查詢, 將所需的流程實例更新為停止狀態, 例如:

    /**更新正在運行狀態中的所有流程實例為停止狀態 4 - Stopped**/
    UPDATE [K2].[Server].[ProcInst]
    SET Status = 4, ServerID = 0
    WHERE Status = 1
  4. 現在應該能在過Workspace看到這些流程實例已經停止,也可以單獨啟動一個測試或刪除它們。

如果您試圖更新數據庫中的狀態而不將Server ID設為0,則狀態將自動更新為1(運行)。ServID=1指示K2服務仍在這個進程上運行。設置ServID=0將告訴K2服務不再使用此服務。

方案2

  1. 首先計算出如果沒有完成的話,有多少個運行實例:

    SELECT * FROM [K2].[Server].[ProcInst]
    WHERE Status = 1
  2. 確定是否需要停止所有這些過程實例,或者僅僅是其中的一個子集。

    /**為某一流程運行實例。可以從[Server].[ProcSet]表中抓取進程 ID**/
    SELECT * FROM [K2].[Server].[ProcInst]
    WHERE ProcID = 3
  3. 一旦您建立了 ProcInst 表中的哪些條目需要更新, 我們需要構建更新查詢腳本:

    /**更新正在運行狀態中的所有流程實例為停止狀態 11 - Paused**/
    UPDATE [K2].[Server].[ProcInst]
    SET Status = 11, ServerID = 0
    WHERE Status = 1
  4. 現在啟動SQL Management Studio, 在SQL Management Studio上運行上面構建的更新查詢腳本。
  5. 運行更新查詢並確認狀態列(Status)更新為 11。

在方案2中,我們將狀態列更新為11,而不是停止4。提供11的ID提供多種好處:

  1. 因為它是K2不期望的狀態(11),K2服務會把它忽略掉,不會當做流程實例,甚至不會註意到它存在;因此,沒有任何操作(action takes)發生在它上面;11不是特別需要的,你可以提供任何不被用作狀態的數字,它也會做同樣的事情(例如,你可以把它更新為666,如果你覺得有意義的話;我把它保持為11,因為這意味著它以前是1 - Running
  2. 將進程置於Paused狀態後,將不會使用K2資源;如果您需要再次啟動流程實例,可以將其更新為1,並且它將很快從上次更新到11的中斷位置被拾起;請記住,已完成(completed)的實例無法再次啟動。
  3. 如果您有一個可疑的進程,將狀態設置為11將在將來幫助您,因為您可以獲得在K2服務處於更好狀態之後需要檢查的ProcInst ID列表。然後你就可以弄明白他們為什麽會跑;請記住,因為它們是狀態11,客戶將無法通過K2 Management/K2 Workspace(Legacy)看到它們,此過程僅在您檢查支持時才保留選項。

流程一直處於Running狀態,應該怎麽停止?