在jbpm主要有两类变量, 一种是流程实例范围的变量,另一种是任务实例范围的变量. 而在流程实例氛围中的变量又分为两种:一种是瞬时变量(transient variable), 另一种是普通的变量, 瞬时变量通过setTransientVariable()方法来设置, 该变量不会持久化到jbpm_variableinstance表中, 它只能在当前流程实例的整个生命周期中存在, 一旦流程实例结束之后, 该变量将不复存在. 而另一种是通过setVariable()和setVariableLocally()方法进行保存,通过getVariable()访问的变量, 这种变量是在整个流程实例中都可访问的, 因为它会保存到jbpm_variableinstance表中。
这里所说的变量和平时我们经常用到的变量稍有些诧异,一般的变量不用持久化到数据库中,只是起到一个保存变量值得作用,然而,这里的变量看起来更像一张关系表,将业务有关的信息表与某个具体的流程绑定在一起,变量起到了把两者联系起来的作用,并且持久化到数据库表中了在流程结束之前都可以从表中取得他们之间的关系,使得业务更灵活。
下面接着上一篇博客的内容,我们给实例添加变量。
@Override
public void addProcessVariable() {
//hashMap对象
Map<String, Object> variable=new HashMap<String, Object>();
//给map添加key和value值
variable.put("userId", "001");
variable.put("userName", "李龙生");
//将变量添加到流程实例中
ProcessInstance processInstance=executionService.startProcessInstanceByKey("test", variable);
}
上述代码即把与业务相关的某个变量设置到一个具体流程实例中,这个流程实例的key为test。
public void modifyMyVariable()
{
//根据流程实例的ID修改,流程实例变量
executionService.setVariable("test.20001", "userId", "002");
}
这里根据实例的ID只修改而不是key值,是因为同一个流程多次部署key值是一样的,如果根据key值修改会改变多个实例的变量值。
public void findMyVariable()
{
//根据实例ID,查询所有实例变量的名字
Set<String> variableSet=executionService.getVariableNames("test.20001");
Iterator iterable=variableSet.iterator();
while (iterable.hasNext()) {
System.out.println(iterable.next());
}
//根据实例ID和实例变量名字,查询所属实例变量的值
Map<String, Object> map=executionService.getVariables("test.20001", variableSet);
Iterator iterator=map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry mEntry=(Map.Entry)iterator.next();
this.print(mEntry.getKey().toString(),mEntry.getValue().toString());
}
}
在查询值得时候需要注意查出的结果是Object类型,因为值可能是各种数据类型。
由实例变量不能得到任务变量,而在任务变量中可以取得实例变量值。
实例变量的作用域大于任务变量。