activiti - 终止 运行 流程实例

activiti - Terminate running process instance

我在 Activiti 中有一个进程 运行,它只包含服务任务。这个过程很长运行,在某些情况下我想中途终止它。使用

启动进程
ProcessInstance pi = runtimeService.startProcessInstanceById(
                processDefinitionId, executionParameters);

activiti forum 开始,可以通过调用

终止进程
void deleteProcessInstance(String processInstanceId, String deleteReason);

runtimeService

问题是 startProcessInstanceById 方法仅在执行完成后 returns。所以我不会得到 processInstance 除非进程已经结束。

但是,我确实调试了代码,并且能够在 JavaDeleate#execute() 方法的实现中找出 processInstanceId

现在,当我从另一个线程调用 runtimeService.deleteProcessInstance(processInstanceId, deleteReason) 方法时,我得到 ActivitiObjectNotFoundException 说明给定的 processInstanceId 不存在。

此外,当 processInstance 为 运行 时,调用 runtimeService.createProcessInstanceQuery().list() returns 空白列表,即使进程为 运行。

一旦进程在每次执行中到达异步点,就会提交给数据库。其他线程在此之前不会看到您的进程。

揭示您的流程的最简单方法是使其第一步异步。这样,调用线程将在创建进程后立即取回控制权。在这种情况下,jobexecutor 将从异步点继续处理流程(Web 请求上下文将丢失。如果您需要一个,则必须将其作为流程变量传递给流程)。在这种情况下,如果您想 return 立即处理结果,则需要对结果进行轮询或使用其他同步机制。

我不确定在这种情况下 deleteProcess 是否真的总是删除进程,有可能遇到数据库锁定异常。但是您可以使用边界中断 signalCatchingEvent 来完成子进程中的所有工作,这可能会立即取消您的进程。

void deleteProcessInstance(String processInstanceId, String deleteReason);

使用 processInstanceId,它仅在提交事务时存在。 (参见 transactions in activiti) 我没有测试是否可以删除当前 运行 流程实例,但我希望那里有某种异常(运行 流程实例正在引用已删除的执行)

对于您的情况,我会添加标志以指示是否必须终止进程。这个标志可以在例如流程实例执行期间的侦听器。如果您不想让您的流程模型变得混乱,您可以自动将侦听器添加到模型中(参见 Hooking into process parsing)。

要在启动后生成流程实例 ID,请在脚本中使用此代码 执行:

forceUpdate();