Skip to main content

Activiti Flowable transient变量

Activiti Flowable transient变量

Activiti6 增加了瞬时变量( transient 变量)。接下来展示如何使用 Activiti6 提供的 transient 变量。​

Activiti6 版本之前所有的变量都会持久化到数据库表( act_ru_variable 或者 act_hi_varinst ),变量存储于 act_hi_varinst 表前提是开启了历史数据的归档开关。瞬时变量使用起来跟持久化的变量一样一样的。唯一的区别是他不会持久化到数据库表。下面对瞬时变量进行一些说明:

瞬时变量可以存活下来知道下一步的等待状态,前提是流程实例的数据可以存储到数据库。

瞬态变量隐藏具有相同名称的持久性变量。

1.1 瞬时变量的操作

void setTransientVariable(String variableName, Object variableValue);
void setTransientVariableLocal(String variableName, Object variableValue);
void setTransientVariables(MaptransientVariables);
void setTransientVariablesLocal(MaptransientVariables);

Object getTransientVariable(String variableName);
Object getTransientVariableLocal(String variableName);

MapgetTransientVariables();
MapgetTransientVariablesLocal();

void removeTransientVariable(String variableName);
void removeTransientVariableLocal(String variableName);

接下来演示瞬时变量的使用过程,操作起来非常的简单。

首先定义一个流程文档(名称process.bpmn20.xml),该流程图如下所示:

部署流程文档如下代码所示:

public void addInputStreamTest() throws Exception {
  //定义的文件信息的流读取
  InputStream inputStream = DeploymentBuilderTest.class.getClassLoader().getResourceAsStream("com/shareniu/activiti6/transientvars/process.bpmn20.xml");
  //流程定义的分类
  String category="variabletypeTest";
  DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().category(category).addInputStream("variabletype.bpmn", inputStream);
  //部署
  Deployment deploy = deploymentBuilder.deploy();
}

启动流程实例时,我们传递的变量是定期的变量。他们将保留和审核历史记录会保留,因为实在没有理由为什么这不应该是这样。

流程实例启动完毕之后,会首先执行‘execute HTTP call’,那么会立刻触发ExecuteHttpCallDelegate类中的逻辑,该类的定义如下所示:

public class ExecuteHttpCallDelegate implements JavaDelegate {
    public void execute(DelegateExecution execution) {
            execution.setTransientVariable("response", "分享牛(shareniu.com)");
            execution.setTransientVariable("responseStatus",200);
    }
}

上述的两个变量response和responseStatus都为瞬时变量。

接下来看一下ProcessResponseExecutionListener类的定义如下所示:

public class ProcessResponseExecutionListener implements ExecutionListener {
    public void notify(DelegateExecution execution) {
    	Listlist=new ArrayList<>();
    	list.add("shareniu1");
    	list.add("shareniu2");
        execution.setTransientVariable("searchResults",list );
    }
 
}

Ok,上述工作完毕之后直接启动新的流程实例如下所示:

public void startProcessInstanceById() throws Exception{
  runtimeService.startProcessInstanceById("transient-vars:1:37504");
}

act_ru_variable表的变化如下所示:

看到上图可知response、responseStatus这两个瞬时变量没有被存储,但是searchResults瞬时变量被存储了,那么问题来了,什么时候瞬时变量会转化为持久化变量呢?关于这一点可以参考随后的章节。