jbpm开发经历3

在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")访问到.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章