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")訪問到.

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