在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")訪問到.