流程一直处于Running状态,应该怎么停止?
概述
我们有遇到这种情况:可能由于某些原因,流程发起后一直处于Running
状态,然后我们想Stop
掉这些出问题的流程,这个时候你在Workspace
里面进行操作,这个操作是不可能完成的,Workspace
也会一直处于Loading
状态。
这种情况下,您唯一的选择就是通过更新K2 Database
来停止这些流程。
在执行操作之前,请熟悉每个状态的含义,这些状态可以在[ServerLog].[Status]
表找到,它的结构如下:
Running
状态的流程实例通常意味着K2服务器仍然在尝试处理有关WF已构建的操作,此状态不需要用户输入,K2正在尝试处理待办生成前的数据。
通过更新 K2 数据库来停止进程的步骤
通常有两种情况下, 您将停止进程实例:
- 只是需要停止某些实例, 但它不会让用户通过
Workspace
(将状态设置为停止4 - Stopped
) - 通过调查, 您发现运行的实例会导致 K2 产品的不良行为。(将状态设置为暂停
11 - Paused
)
方案1
- 标识需要停止的运行实例
SELECT * FROM [K2].[Server].[ProcInst]
WHERE Status = 1
- 确定是否需要停止所有这些进程实例, 或仅对其中的某个子集进行停止。
/**为某一流程运行实例。可以从[Server].[ProcSet]表中抓取进程 ID**/
SELECT * FROM [K2].[Server].[ProcInst]
WHERE ProcID = 3
- 运行查询, 将所需的流程实例更新为停止状态, 例如:
/**更新正在运行状态中的所有流程实例为停止状态 4 - Stopped**/
UPDATE [K2].[Server].[ProcInst]
SET Status = 4, ServerID = 0
WHERE Status = 1
- 现在应该能在过
Workspace
看到这些流程实例已经停止,也可以单独启动一个测试或删除它们。
方案2
- 首先计算出如果没有完成的话,有多少个运行实例:
SELECT * FROM [K2].[Server].[ProcInst]
WHERE Status = 1
- 确定是否需要停止所有这些过程实例,或者仅仅是其中的一个子集。
/**为某一流程运行实例。可以从[Server].[ProcSet]表中抓取进程 ID**/
SELECT * FROM [K2].[Server].[ProcInst]
WHERE ProcID = 3
- 一旦您建立了 ProcInst 表中的哪些条目需要更新, 我们需要构建更新查询脚本:
/**更新正在运行状态中的所有流程实例为停止状态 11 - Paused**/
UPDATE [K2].[Server].[ProcInst]
SET Status = 11, ServerID = 0
WHERE Status = 1
- 现在启动
SQL Management Studio
, 在SQL Management Studio
上运行上面构建的更新查询脚本。 - 运行更新查询并确认状态列(
Status
)更新为 11。