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

跳过监听器器和输入/输出映射

可以跳过执行和任务监听器以及执行重新启动的实例的输入/输出映射的调用。当在无法访问所涉及的流程应用程序部署及其包含的类的系统上执行重新启动时,此功能很有用。

在API中,这两种方法#skipCustomListeners,并#skipIoMappings 可以用于此目的:

ProcessDefinition processDefinition = ...;

List<String> processInstanceIds = ...;

runtimeService.restartProcessInstances(processDefinition.getId())

  .startBeforeActivity("activity")

  .processInstanceIds(processInstanceIds)

  .skipCustomListeners()

  .skipIoMappings()

  .execute();

使用初始变量集重新启动流程实例

默认情况下,将使用最后一组变量重新启动流程实例。要选择初始变量集,initialSetOfVariables可以使用该方法。

此功能不仅复制开始变量,还将复制在旧过程实例的开始活动中设置的所有过程变量的第一版。

ProcessDefinition processDefinition = ...;

List<String> processInstanceIds = ...;

runtimeService.restartProcessInstances(processDefinition.getId())

  .startBeforeActivity("activity")

  .processInstanceIds(processInstanceIds)

  .initialSetOfVariables()

  .execute();

如果历史流程实例没有唯一的启动活动,则无法设置初始变量集。在这种情况下,不会接管任何变量。

省略历史流程实例的业务密钥

默认情况下,流程实例将使用与历史流程实例相同的业务密钥重新启动。通过使用该方法withoutBusinessKey,不会设置重新启动的流程实例的业务密钥。

ProcessDefinition processDefinition = ...;

List<String> processInstanceIds = ...;

runtimeService.restartProcessInstances(processDefinition.getId())

  .startBeforeActivity("activity")

  .processInstanceIds(processInstanceIds)

  .withoutBusinessKey()

  .execute();

执行

重启可以通过批处理同步执行(阻塞)或异步执行(非阻塞)。

以下是一些偏爱其中一个的原因:

在以下情况下使用同步执行:

 流程实例的数量很少

 重新启动应该是原子的,即应该立即执行,并且如果至少一个流程实例无法重新启动,则应该失败

在以下情况下使用异步执行:

流程实例的数量很大

 应重新启动所有流程实例,使其与其他实例脱钩,即,每个实例都在其自己的事务中重新启动

重新启动应由另一个线程执行,即作业执行程序应处理执行

 

同步执行

要同步执行重新启动,请使用该execute方法。它将阻塞,直到重新启动完成。

ProcessDefinition processDefinition = ...;

List<String> processInstanceIds = ...;

runtimeService.restartProcessInstances(processDefinition.getId())

  .startBeforeActivity("activity")

  .processInstanceIds(processInstanceIds)

  .execute();

如果可以重启所有流程实例,则重启成功。

异步批处理执行

要异步执行重新启动,请使用该executeAsync方法。它将立即返回对执行重启的批处理的引用。

ProcessDefinition processDefinition = ...;

List<String> processInstanceIds = ...;

Batch batch = runtimeService.restartProcessInstances(processDefinition.getId())

  .startBeforeActivity("activity")

  .processInstanceIds(processInstanceIds)

  .executeAsync();

使用批处理,流程实例重新启动分为几个异步执行的作业。这些批处理作业由作业执行程序执行。有关更多信息,请参见批处理部分。如果所有批处理执行作业均成功完成,则批处理已完成。但是,与同步执行相反,不能保证所有或全部流程实例都不会重新启动。由于重新启动分为几个独立的作业,因此每个作业都可能失败或成功。

如果重新启动作业失败,则作业执行程序将重试该作业,如果没有重试,则会创建事件。在这种情况下,必须执行手动操作才能完成批量重新启动:可以增加作业的重试次数或删除作业。删除会取消特定实例的重启,但不会影响该实例之外的批处理。

 技术支持:盘古BPM工作流平台

相关教程