2016-11-22 67 views
0

我在Activiti中运行一个只包含服务任务的porcess。这个间隔很长,有时候我想在中途终止。进程正在使用activiti - 终止正在运行的流程实例

ProcessInstance pi = runtimeService.startProcessInstanceById(
       processDefinitionId, executionParameters); 

activiti forum开始,过程可以通过在runtimeService调用

void deleteProcessInstance(String processInstanceId, String deleteReason); 

被终止。

问题是startProcessInstanceById方法只在执行完成后才返回。所以我没有得到processInstance,除非过程已经结束。

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

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

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

回答

2
void deleteProcessInstance(String processInstanceId, String deleteReason); 

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

在你的情况,我想补充标志以表明过程是否必须终止。这个标志可以在例如在流程实例执行期间的监听器。如果您不想让流程模型混乱,可以自动将侦听器添加到模型中(请参阅Hooking into process parsing)。

+0

Martin在这里有正确的答案。使用Parse Handler自动将侦听器添加到将终止活动边界上的实例(完成或创建事件)的每个服务任务。您将无法使用REST API或标准Java流程实例终止或删除呼叫,因为您从来没有真正使用“直通流程”访问数据库。 –

1

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

最简单的方法来揭示你的过程是让它的第一步异步。通过这种方式调用线程将在创建进程后尽快恢复控制。在这种情况下,jobexecutor将继续从异步点开始处理进程(Web请求上下文将丢失,如果需要,则必须将它作为例如流程变量进行处理)。如果要立即返回处理结果,则需要对结果进行轮询或在此情况下使用其他同步机制。

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

相关问题