activiti - 终止正在运行的流程实例

时间:2016-11-22 11:17:27

标签: activiti bpm

我在Activiti中运行了一个只包含服务任务的访客。这是一个很长的路程,在某些情况下我想在途中终止它。使用

开始流程
ProcessInstance pi = runtimeService.startProcessInstanceById(
                processDefinitionId, executionParameters);

activiti forum开始,可以通过调用

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

on runtimeService

问题是startProcessInstanceById方法仅在执行完成后返回。除非流程已经结束,否则我无法获得processInstance

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

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

此外,当processInstance正在运行时,即使进程正在运行,调用runtimeService.createProcessInstanceQuery().list()也会返回空白列表。

3 个答案:

答案 0 :(得分:3)

void deleteProcessInstance(String processInstanceId, String deleteReason);

使用processInstanceId,它仅在提交事务时出现。 (见transactions in activiti) 我没有测试是否有可能删除当前正在运行的流程实例,但我希望有一些异常(运行流程实例引用已删除的执行)

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

答案 1 :(得分:1)

进程在每次执行到达异步点后都会被提交到数据库。其他线程在此之前不会看到您的进程。

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

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

答案 2 :(得分:-1)

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

forceUpdate();