在jbpm主要有两类变量, 一种是流程实例范围的变量,另一种是任务实例范围的变量. 而在流程实例氛围中的变量又分为两种:一种是瞬时变量(transient variable), 另一种是普通的变量, 瞬时变量通过setTransientVariable()方法来设置, 该变量不会持久化到jbpm_variableinstance表中, 它只能在当前流程实例的整个生命周期中存在, 一旦流程实例结束之后, 该变量将不复存在. 而另一种是通过setVariable()和setVariableLocally()方法进行保存,通过getVariable()访问的变量, 这种变量是在整个流程实例中都可访问的, 因为它会保存到jbpm_variableinstance表中.
如何设置流程变量:
/**
* 创建流程实例,添加流程变量
*/
@Override
public voidcreateInstance() {
super.startUp();
Map<String,Object>variable = new HashMap<String,Object>();
variable.put("userId","001");
variable.put("userName","tom");
ProcessInstanceprocessInstance = executionService.startProcessInstanceByKey("test",variable);
super.print("流程实例ID",processInstance.getId());
}
在创建流程的时候同时将流程实例持久化到数据库,这时数据库中就已经有持久化的数据,下面看一下如何获得这些流程变量。
/**
* 获取流程变量
*/
public voidgetMyVariable(){
super.startUp();
//根据流程实例名称和流程实例ID获得
String userId = executionService.getVariable("test.10001","userId").toString();
String userName = executionService.getVariable("test.10001","userName").toString();
this.print("userId",userId);
this.print("userName",userName);
}
添加task流程变量
/**
* 添加task流程变量
*/
public voidaddTaskVariable(){
super.startUp();
Map<String,Object> map= new HashMap<String,Object>();
map.put("taskUserID","100");
map.put("taskUserName","jack");
//获取到task的ID,根据ID将这些数据持久化到数据库
taskService.setVariables("10004",map);
}
获取task变量和获取流程变量大同小异,只是把流程实例的ID换成task的ID。
/**
* 获取task变量
*/
public voidgetTaskVariable(){
super.startUp();
String taskUserID = taskService.getVariable("10004","taskUserID").toString();
String taskUserName = taskService.getVariable("10004","taskUserName").toString();
print("taskuserID",taskUserID);
print("taskUserName",taskUserName);
}
获取所有的变量内容:
public void findMyVariable(){
super.startUp();
Set<String> set = executionService.getVariableNames("test.10001");
Iterator iter =set.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
Map<String,Object> map= executionService.getVariables("test.10001", set);
Iterator it =map.entrySet().iterator();
while(it.hasNext()){
Map.Entry m =(Map.Entry)it.next();
this.print(m.getKey().toString(),m.getValue().toString());
}
}
流程变量在流程没有complete的时候会一直存在,直到整个流程完结后才会从数据库中消失(只是从变量表中到历史表中,可以到历史表即hist类别表中取寻找)。
流程实例变量还是很好理解的, 任务实例变量则相对复杂一些. 任务实例变量还可以直接访问实例变量, 这可以按照java程序中变量的作用范围来理解,任务实例变量相当于局部变量, 仅在当前流程实例中可见, 流程实例变量相当于全局变量, 在整个流程中可见. 当通过任务实例查找一个流程时, 如果在当前的任务实例中没有找到, 将继续到流程实例中去找. 比如通过ContextInstance.setVariable("tgb", " tgb ")创建的流程实例变量, 那么任务实例可以直接通过TaskInstance.getVariable("tgb")访问到.