我在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()
也会返回空白列表。
答案 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();