一步一步学JBPM(9)——流程变量

流程变量的使用,大大增加了JBPM的灵活性。用户可以在流程执行过程中的任何时间插入流程变量,然后可以随时的读取流程变量,这样可以实现用户的数据传递。

总体来说流程变量有两大类。一种是execution范围的也就是流程执行的变量,另一种是task范围的,也就是任务范围的变量。下面介绍一下这两种变量的使用。

1:变量的读取。

1.1execution写变量

execution写变量的方式一般来说有两种,

一种是在流程实例的创建的时候,给流程实例添加变量。

public String createInstance(String key,Map<String,Object> variables) {
  ProcessInstance processInstance = executionService.startProcessInstanceByKey(key, variables);
	return processInstance.getId();
}


其中startProcessInstanceByKey方法启动流程,第一个参数是流程定义的key,表示启动的是那个流程定义。第二个参数是要给这个新启动的流程添加变量,这个变量可以使用map,也可以是一个单独的字符串。

第二种添加变量的方法是:

public StringsubmitProcess(String taskId,Map<String,String> variables) {
 Task task = taskService.getTask(taskId);
 Execution execution =executionService.findExecutionById(task.getExecutionId());
 //给流程实例从新设置变量.
executionService.setVariable(execution.getId(),"prevId", variables.get("prevId"));
executionService.setVariable(execution.getId(),"sign", variables.get("sign"));
 
taskService.completeTask(taskId);
returntask.getExecutionId();
}

使用executionService这个jbpm的服务类,然后在调用它的setVariable方法,第一个参数是流程实例ID,也就是你要给那个流程execution添加变量,第二个参数是变量,这个也可以是map对象。

 

1.2 execution读变量

读变量的方式很简单。首先使用

Execution execution =executionService.findExecutionById(task.getExecutionId());

方法得到流程实例execution 然后使用

String ownerId =execution.getVariable("planId").toString();

根据变量名称获取对应的值。

1.3 task写变量

使用taskService写变量,第一个参数是taskID,第二个参数是map类型的集合。

taskService.setVariables(taskId,variables);

这个和execution区别就是这种方式第二个参数不能是字符串。只能是一个map集合。

1.4 task读变量

task读变量方式和写变量的是对应的

taskService.getVariable(taskId,"sign");

第一个参数是taskID,第二个是变量名称。

 

2:两种变量的联系

这两种变量其实就相当于java类中的两个变量,他们两个的作用域不同而已。因为一个execution可能包含多个任务,所以execution的范围大,task的范围是包含在execution范围中的,也就是说task可以取到execution变量的值。

 

3:流程变量也可以在JBDL中定义

他们最后都会持久化到jbpm数据库中,最终的原理都是一样的。JBDL定义变量的方式如下:

<taskassignee="kezhang001" form="/service/plan/start/getTask"g="238,221,92,52" name="科长审批">
                  <assignment-handlerclass="com.zhjy.bpm.Listener.TaskListener">
                          <fieldname="msg">
                          <!--这个变量标志该流程是计划审批流程,相对于的是项目PROJECT,在流程变量中获取就行-->
                                  <stringvalue="PLAN"/>
                          </field> 
</assignment-handler>
      <transition g="-67,-14"name="提交给主任" to="主任审批"/>
   </task>

其中msg就是一个变量,变量的值是plan,这个变量的读取不能使用上述几种方法。一般在listener中采用映射的方法读取。

首先定义一个私有变量,然后通过它的get方法获取

private String msg;

public voidsetMsg(String msg) {
this.msg= msg;
}

这样在流程执行中就会自动拿到msg的值。

 

总体来说流程变量的读取操作起来简单,而且非常实用。一般都用来在启动流程中将业务主键ID放到流程变量中。比如我们要审核张三的请假条,就把张三请假条这条数据的主键放到变量中。方便以后使用。

你可能感兴趣的:(一步一步学JBPM(9)——流程变量)