工作流引擎历史流程实例重启
历史流程实例重启
流程实例终止后,其历史数据仍然存在,并且只要历史记录级别设置为FULL,就可以访问它以还原流程实例。例如,这在终止未按预期方式进行时可能很有用。此API的用例可能是:
1、恢复已错误取消的流程实例的最后状态
2、因错误决定而终止后重新启动流程实例
为了执行这样的操作,流程引擎提供了流程实例重启API,该API通过进行输入RuntimeService.restartProcessInstances(...)。该API允许使用流畅的构建器在一个调用中指定多个实例化指令。
请注意,这些操作也可以通过REST进行:重新启动流程实例和重新启动流程实例(异步)
通过实例重新启动流程实例
例如,请考虑以下过程模型,其中红点标记了活动任务:
让我们假设工作人员已使用以下代码在外部取消了流程实例:
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().singleResult();
runtimeService.deleteProcessInstance(processInstance.getId(), "any reason");
之后,管理器决定恢复该流程实例的最后状态。
runtimeService.restartProcessInstance(processInstance.getProcessDefinitionId())
.startBeforeActivity("receivePayment")
.startBeforeActivity("shipOrder")
.processInstanceIds(processInstance.getId())
.execute();
流程实例已使用最后一组变量重新启动。但是,在重新启动的流程实例中仅设置了全局变量。可以手动设置局部变量,例如通过调用RuntimeService.setVariableLocal(...)。
从技术上讲,已经创建了一个新的流程实例。
请注意: 历史和重新启动的流程实例的ID是不同的。
操作语义学
在下文中,记录了流程实例重新启动功能的确切语义。建议阅读本节以充分了解此功能的作用,功能和限制。
实例化指令类型
流程实例重新启动构建器提供了以下要提交的说明:
1、startBeforeActivity(String activityId)
2、startAfterActivity(String activityId)
3、startTransition(String transitionId)
有关指令类型的信息,请参阅类似的 修改指令类型部分。
选择要重新启动的流程实例
可以通过提供一组流程实例ID或提供历史流程实例查询来选择要重新启动的流程实例。也可以同时指定流程实例ID和查询的列表。然后,要重新启动的流程实例将成为结果集的并集。
流程实例列表
可以将应重新启动的流程实例指定为流程实例ID的列表:
ProcessDefinition processDefinition = ...;
List<String> processInstanceIds = ...;
runtimeService.restartProcessInstances(processDefinition.getId())
.startBeforeActivity("activity")
.processInstanceIds(processInstanceIds)
.execute();
或者,对于一定数量的流程实例,有一个方便的varargs方法:
ProcessDefinition processDefinition = ...;
HistoricProcessInstance instance1 = ...;
HistoricProcessInstance instance2 = ...;
runtimeService.restartProcessInstances(processDefinition.getId())
.startBeforeActivity("activity")
.processInstanceIds(instance1.getId(), instance2.getId())
.execute();
历史流程实例查询
如果实例事先未知,则可以通过历史流程实例查询选择流程实例:
HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService
.createHistoricProcessInstanceQuery()
.processDefinitionId(processDefinition.getId())
.finished();
runtimeService.restartProcessInstances(processDefinition.getId())
.startBeforeActivity("activity")
.historicProcessInstanceQuery(historicProcessInstanceQuery)
.execute();
技术支持:盘古BPM工作流平台
相关教程
- 2020-05-05
- 2020-04-29
- 2020-04-28
- 2020-04-27
- 2020-04-26
- 2020-04-25
- 2020-04-24
- 2020-04-23
- 2020-04-22
- 2020-04-18