工作流引擎历史流程实例重启

历史流程实例重启

流程实例终止后,其历史数据仍然存在,并且只要历史记录级别设置为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工作流平台

相关教程