流程变量的使用,大大增加了JBPM的灵活性。用户可以在流程执行过程中的任何时间插入流程变量,然后可以随时的读取流程变量,这样可以实现用户的数据传递。
总体来说流程变量有两大类。一种是execution范围的也就是流程执行的变量,另一种是task范围的,也就是任务范围的变量。下面介绍一下这两种变量的使用。
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对象。
读变量的方式很简单。首先使用
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集合。
task读变量方式和写变量的是对应的
taskService.getVariable(taskId,"sign");
第一个参数是taskID,第二个是变量名称。
这两种变量其实就相当于java类中的两个变量,他们两个的作用域不同而已。因为一个execution可能包含多个任务,所以execution的范围大,task的范围是包含在execution范围中的,也就是说task可以取到execution变量的值。
他们最后都会持久化到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放到流程变量中。比如我们要审核张三的请假条,就把张三请假条这条数据的主键放到变量中。方便以后使用。