使用HistoryService接口来查询历史流程实例

在Flowable中,已终止的流程实例不能通过RuntimeService接口直接查询到。相反,你需要使用HistoryService接口来查询历史流程实例,并从中筛选出已终止的实例。以下是正确的步骤:

  1. 确保你的应用程序连接到正确的Flowable流程引擎实例。你需要使用Flowable的API来执行后续的操作。

  2. 使用HistoryService接口的createHistoricProcessInstanceQuery()方法构建查询,设置适当的条件来筛选已终止的流程实例。

1
2
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery()
.finished();
  1. 执行查询并获取已终止的流程实例列表。
1
List<HistoricProcessInstance> terminatedInstances = query.list();
  1. 根据需要选择要重启的流程实例。你可以根据流程实例的ID或其他属性进行选择。

  2. 如果你需要将已终止的流程实例重新激活,可以创建一个新的流程实例,或者使用历史流程实例中的数据进行修复。请注意,这取决于你的业务需求和流程定义的复杂性。

请注意,已终止的流程实例是历史数据,因此无法直接重新激活。你需要根据业务需求进行相应的处理。使用HistoryService接口可以提供有关已终止流程实例的详细信息,但不能直接操作它们。

使用HistoryService获取的流程实例信息重新发起一个新的流程实例

要使用HistoryService获取的流程实例信息重新发起一个新的流程实例,你需要执行以下步骤:

  1. 获取已终止流程实例的相关信息,如流程定义ID、业务关联键等。
1
2
3
String processDefinitionId = historicProcessInstance.getProcessDefinitionId();
String businessKey = historicProcessInstance.getBusinessKey();
// 其他需要的信息
  1. 使用RuntimeService接口的startProcessInstanceById()方法或startProcessInstanceByKey()方法来启动新的流程实例。根据你的需求选择合适的方法。

如果你选择使用流程定义ID:

1
2
ProcessInstance newProcessInstance = runtimeService
.startProcessInstanceById(processDefinitionId, businessKey);

如果你选择使用流程定义的键(Key):

1
2
ProcessInstance newProcessInstance = runtimeService
.startProcessInstanceByKey(processDefinitionKey, businessKey);

在这里,processDefinitionKey是流程定义的键(Key)。

  1. 在启动新的流程实例后,你可以执行后续的操作,例如处理任务等,以继续流程的执行。

请注意,重新发起的新流程实例与原始已终止的流程实例是独立的。你需要根据需求来处理任何必要的数据复制或流程初始化操作。

设置重新发起的流程实例的变量(variables)

要设置重新发起的流程实例的变量(variables),你可以使用RuntimeService接口的startProcessInstanceById()startProcessInstanceByKey()方法的重载版本来指定变量的值。以下是设置变量的步骤:

  1. 获取已终止流程实例的相关信息,如流程定义ID、业务关联键等。
1
2
3
String processDefinitionId = historicProcessInstance.getProcessDefinitionId();
String businessKey = historicProcessInstance.getBusinessKey();
// 其他需要的信息
  1. 创建一个Map对象,将变量名和对应的值放入该对象中。
1
2
3
4
Map<String, Object> variables = new HashMap<>();
variables.put("variable1", value1);
variables.put("variable2", value2);
// 添加其他变量

在上述代码中,"variable1"和"variable2"是变量名,value1和value2是对应的值。

  1. 使用RuntimeService接口的startProcessInstanceById()方法或startProcessInstanceByKey()方法的重载版本来启动新的流程实例,并在参数中传递变量的Map对象。

如果你选择使用流程定义ID:

1
2
ProcessInstance newProcessInstance = runtimeService
.startProcessInstanceById(processDefinitionId, businessKey, variables);

如果你选择使用流程定义的键(Key):

1
2
ProcessInstance newProcessInstance = runtimeService
.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
  1. 通过上述步骤,变量将与新的流程实例关联,并可以在流程的执行中使用。

请注意,如果重新发起的流程实例需要使用历史流程实例的数据作为变量的值,你需要根据业务需求将这些数据复制到新的流程实例中。

关于新发起流程的processInstanceName为空的情况说明

在Flowable中,流程实例的名称(process instance name)是一个可选的属性,并且不会自动从历史流程实例中继承。因此,在重新发起流程实例时,processInstanceName默认为空。

如果你想为重新发起的流程实例设置一个名称,可以通过设置流程变量的方式来实现。以下是设置流程实例名称的步骤:

  1. 获取已终止流程实例的相关信息,如流程定义ID、业务关联键等。
1
2
3
String processDefinitionId = historicProcessInstance.getProcessDefinitionId();
String businessKey = historicProcessInstance.getBusinessKey();
// 其他需要的信息
  1. 使用RuntimeService接口的startProcessInstanceById()startProcessInstanceByKey()方法启动新的流程实例,并在参数中传递变量的Map对象。
1
2
3
4
5
Map<String, Object> variables = new HashMap<>();
variables.put("processInstanceName", "My Process Instance"); // 设置流程实例名称

ProcessInstance newProcessInstance = runtimeService
.startProcessInstanceById(processDefinitionId, businessKey, variables);

在上述代码中,我们将流程实例名称作为变量 "processInstanceName" 的值传递给了startProcessInstanceById()方法。

  1. 在新的流程实例中,你可以使用RuntimeService接口的getVariable()方法来获取流程实例名称。
1
2
String processInstanceName = runtimeService
.getVariable(newProcessInstance.getId(), "processInstanceName");

在上述代码中,newProcessInstance.getId()是重新发起的流程实例的ID。

通过上述步骤,你可以在重新发起的流程实例中设置和获取流程实例名称。

关于流程中HistoricProcessInstanceendTime字段为空的情况说明

在Flowable中,HistoricProcessInstanceendTime字段为空是因为该字段仅在流程实例完成时被设置为非空值。当你重新发起一个新的流程实例时,该实例尚未完成,因此endTime字段仍然为空。

HistoricProcessInstance对象表示已完成或已终止的流程实例的历史记录,其中endTime字段指示流程实例的结束时间。只有在流程实例完成时,即流程的所有活动都已完成,endTime字段才会被设置为相应的时间戳。

当你重新发起一个新的流程实例时,新的流程实例将被视为全新的实例,其endTime字段将在实例完成时被设置为相应的时间戳。因此,刚刚重新发起的流程实例的endTime字段为空是符合预期的行为。

如果你需要确定新流程实例的完成状态,你可以使用RuntimeService接口或其他相关接口来查询并检查流程实例的状态。例如,可以使用RuntimeServicecreateProcessInstanceQuery()方法查询并判断流程实例是否已完成。

1
2
3
ProcessInstanceQuery query = runtimeService
.createProcessInstanceQuery().processInstanceId(newProcessInstanceId);
boolean isProcessInstanceFinished = query.singleResult() == null;

在上述代码中,newProcessInstanceId是你重新发起的新流程实例的ID。

⬆︎TOP