前面的博客我们讲了什么是JBPM以及各种流程服务,今天这篇博客我们分析一下流程实例中的流程变量和任务变量的区别。我们知道从jpdl.xml文件我们的流程实例就已经存在了,在流程的部署和创建、运行过程中都少不了流程变量,在每一流程中又会存在流程任务,而在每一个任务中又会有任务变量,从存在的范围来说,流程实例的变量要比流程任务变量的范围广,但是究竟他们之间有什么关系呢??我们从例子中寻找答案!
下面是流程实例文件:test.jpdl.xml:
<span style="font-size:10px;"><span style="font-size:12px;"><?xml version="1.0" encoding="UTF-8"?>
<process key="test" name="test" xmlns="http://jbpm.org/4.4/jpdl">
<start g="303,29,48,48" name="start1">
<transition g="-52,-22" name="提交到科长" to="科长审批"/>
</start>
<task assignee="张三" g="279,148,92,52" name="科长审批">
<transition g="-52,-22" name="提交到主任" to="主任审批"/>
</task>
<task assignee="李四" g="281,256,92,52" name="主任审批">
<transition g="-50,-22" name="通过" to="end1"/>
</task>
<end g="305,359,48,48" name="end1"/>
</process></span></span>
1、创建流程实例:
public void createInstance() {
super.startUp();
Map<String,Object> variable=new HashMap<String,Object>();
variable.put("userId1", "001");
variable.put("userName1", "tom");
//流程实例变量
ProcessInstance processInstance=executionService.startProcessInstanceByKey("test", variable);
super.print("流程实例ID", processInstance.getId());
}
部署流程之后创建流程实例,其ID为test.40001,在此同时也创建了两个流程变量,分别为userId1和userName1,并赋予了值。
2、获取任务ID:<span style="font-size:10px;">public void getTask() {
ProcessEngine processEngine = Configuration.getProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.findPersonalTasks("张三");
Task task = tasks.get(0);
System.out.println("任务数量===" + tasks.size() );
System.out.println("任务名词===" + task.getActivityName());
System.out.println("任务人员===" + task.getAssignee() + "任务ID===" + task.getId());
}</span>
执行之后获得的任务ID为40004。
3、给任务40004添加两个任务变量:
<span style="font-size:10px;">public void addTaskVariable(){
super.startUp();
Map<String,Object> map=new HashMap<String,Object>();
map.put("taskUserId", "100");
map.put("taskUserName", "jack");
taskService.setVariables("40004", map);
}</span>
4、现在我们通过函数获取流程实例变量的ID:
<span style="font-size:10px;">public void getMyVariable(){
super.startUp();
String userId=executionService.getVariable("test.40001", "userId1").toString();
String userName=executionService.getVariable(
"test.40001", "userName1").toString();
this.print("userId1", userId);
this.print("userName1", userName);
}</span>
程序得到的流程实例的ID为:
userId1=======001
userName1=======tom
5、现在我们通过函数获取任务变量的ID:
<span style="font-size:10px;">public void getTaskVariable(){
super.startUp();
String taskUserId=taskService.getVariable("40004", "taskUserId").toString();
Stringtask UserName=taskService.getVariable(
"40004", "taskUserName").toString();
print("taskUserId",taskUserId);
print("taskUserName",taskUserName);
}</span>
任务变量的ID:
taskUserId=======100
taskUserName=======jack
6、现在我们完成任务:<span style="font-size:10px;">public void completeTask() {
super.startUp();
taskService.completeTask("40004");
}</span>
然后再次获取任务变量,此时就已经不能在得到任务变量了,因为任务变量和任务是绑定到一起的,任务没有了,任务变量也就不存在了。
7、我们获取流程实例的变量:
运行的结果为:
userId1=======001
userName1=======tom
也就是还可以获得流程实例的变量,因为实例变量和流程实例是绑定的,任务虽然已经完成了,但是实例没有消失,所以流程实例的变量还是存在的。
流程实例变量和任务变量是一种包含的关系,流程变量和流程相互绑定,任务变量和任务绑定,流程变量的范围更大一些,只要流程实例存在,实例变量就不会消失,不管任务是否存在。对于流程变量的更新或取得所有的流程变量只要采用迭代器的方式输出即可,这里不详细介绍了。