ZPY博客

Activiti7已完成的流程实例获取变量

我们知道,在Activiti7中

runtimeService.getVariable(String executionId, String processInstanceId)

方法可以获取当前流程实例的变量,但是这个方法存在一个问题是,需要传入一个executionId,而如果流程实例已经完成,execution对象为空,自然也获取不到变量了。其实从命名也可以看出,runtimeService是针对当前进行中的实例的一些操作。

那么如果我们想获取已完成的实例中的变量应该怎么办呢?其实Activiti中已经提供了,如下:

historyService
        .createHistoricVariableInstanceQuery()
        .processInstanceId(processInstanceId)
        .variableName(variableName)
        .excludeTaskVariables()
        .list()

但是需要注意的是,这里要加上excludeTaskVariables()这个条件,因为如果不加这个条件的话取出来的变量是有重复的,这个条件的意思是去除任务变量,这是什么意思?

例如一个流程有三个任务,发起,审批,存档,有一个变量num,如果这个流程实例已经完成,那么数据库中act_hi_varinst表中实际上会有4个num的重复记录,为什么会这样呢?因为这是一张历史记录表,每个任务在执行过程中都记录了变量num的值,每条记录的taskId为对应任务的id,而taskId为空的变量记录则是相对于整个流程实例而言的,所以我们可以通过taskId取到具体每一个任务当时的变量num的值,也可以通过excludeTaskVariables()这个条件取得最后流程实例完成时的变量num的值。