jbpm4.4學習總結(三)常用接口使用說明

在jbpm4.4開發過程中,我們需要使用其提供的接口來完成任務,爲什麼我們要心甘情願的被jbpm綁架呢?主要是因爲它簡單唄……

1.AssignmentHandler

AssignmentHandler是jbpm爲我們提供的一個綁定用戶,分配任務的接口,我們可以通過實現這個接口來指定Task 的執行者,必須配合jpdl.xml下的標籤和程序來使用,web環境下一般都是session中的用戶。

舉個例子:

一個員工提交一個請假申請,如果我們給這個Task添加一個AssignmentHandler,把員工的姓名綁定進去,那麼jbpm就會知道,這個流程是這個員工創建的……

 按正常邏輯請假單已經提交到了領導那,我們可以通過再實現一個AssignmentHandler接口,通過AssignmentHandler動態的對流程實例定義Actor,將領導設置成task的執行者。這樣做的好處就是靈活……

當領導登錄時,session中是領導的姓名,領導查自己的任務列表就會看到那份員工提交的請假單了。

  • jpdl.xml的一部分(主要是<assignment-handler > 和<decision >兩個標籤
  1.    <task assignee="${name}" g="235,146,92,52" name="LeaveApplication"> 
  2.       <assignment-handler class="com.mtf.jbpm.handler.NewApplicationAssignmentHandler"/> //創建請假單前綁定用戶,員工    
  3.       <transition g="-113,-17" name="SubmitApply" to="ManagerApprove"/> 
  4.    </task> 
  5.    <task assignee="${name}" g="244,235,92,52" name="ManagerApprove"> 
  6.     <assignment-handler class="com.mtf.jbpm.handler.ManagerApproveAssignmentHandler"/>//當請假單流轉到manager那時觸發,領導     
  7.       <transition g="-46,-23" name="ManagerApproved" to="DaysCheck"/> 
  8.       <transition g="-15,-35" name="ManagerDisApproved" to="end"/> 
  9.    </task> 
  10.     <decision g="67,240,48,48" name="DaysCheck"> 
  11.    <handler class="com.mtf.jbpm.handler.DaysCheckHandler" />   //分支流程
  12.       <transition g="-20,-2" name="LessThan3Days" to="HrMakeSure"/> 
  13.       <transition g="-49,-11" name="MoreThan3Days" to="ExecutiveApprove"/> 
  14.    </decision> 
  15.  
  • 申請請假單的AssignmentHandler
  1. public class NewApplicationAssignmentHandler implements AssignmentHandler{  
  2.  
  3.     @Override 
  4.     public void assign(Assignable assignable, OpenExecution execution)  
  5.             throws Exception {  
  6.         System.out.println("pxj 創建一leave");  
  7.         String name =(String) execution.getVariable("name");  
  8.         System.out.println(name);  
  9.         assignable.setAssignee(name);    
  10.     }  
  • 領導的AssignmentHandler
  1. public class ManagerApproveAssignmentHandler implements AssignmentHandler{  
  2.  
  3.     @Override 
  4.     public void assign(Assignable assignable, OpenExecution execution)  
  5.             throws Exception {  
  6.         System.out.println("經理 開始審批");  
  7.         String id = (String) execution.getVariable("parentId");  
  8.         int managerId = Integer.parseInt(id);  
  9.         EmployeeDao employeeDao = new EmployeeDaoImpl();  
  10.         Employee  e= employeeDao.findEmployeeById(managerId);  
  11.         assignable.setAssignee(e.getE_name_cn());  
  12.     }  

其中parentId是請假單提交的時候設定的,解釋一下:員工提交請假單當然是提交到自己領導那了,於是我在提交請假單的方法中查找了一下自己領導的id,存在這個parentId中,到這裏面在尋找這個人的姓名(領導的名字)通過assignable.setAssignee(e.getE_name_cn());  將這個Task的執行者設置成領導……於是乎當領導查自己的任務列表時,就能查到自己下屬提交的請假單了

  • 這個方法就是提交請假單的方法,應該寫在前面纔對,思路有些混亂……
  1. /**  
  2.  * submitApplication 2012-7-9  
  3.  */ 
  4. @Override 
  5. public void submitApplication(String actorId, float days,  
  6.         ProcessInstance pi, int id) {  
  7.     String taskId = processEngine.getTaskService().createTaskQuery()  
  8.             .processInstanceId(pi.getId()).uniqueResult().getId();  
  9.     // 綁定流程  
  10.     // 尋找上級  
  11.     LeaveDao dao = new LeaveDaoImpl();  
  12.     Leaves leaves = null;  
  13.     try {  
  14.         List<Leaves> all = dao.queryParentById(id, 1);  
  15.         for (int i = 0; i < all.size(); i++) {  
  16.             leaves = all.get(i);  
  17.         }  
  18.     } catch (Exception e) {  
  19.     }  
  20.     System.out.println("TaskId" + taskId);  
  21.     Task tasks = processEngine.getTaskService().getTask(taskId);  
  22.     String executionId = tasks.getExecutionId();  
  23.     processEngine.getExecutionService().setVariable(executionId,  
  24.             "parentId",new String(leaves.getL_emp_id()+""));  
  25.     processEngine.getExecutionService().setVariable(executionId, "days",  
  26.             days);  
  27.     processEngine.getTaskService().completeTask(taskId);  

主要接收:流程實例id,創建人姓名,請假人id,本次總結我只想把jbpm的接口總結一下,關於流程的部分請看下部分。

  • 實際上任務的分配方式有很多種
  1. 任務的分類與分配方式  
  2.         任務的分類:  
  3.             個人任務  
  4.                 方式一:指定assignee屬性  
  5.                     可以指定爲具體的某個String(具體某人);  
  6.                     也可以指定一個流程變量,會使用計算出的結果(結果要是String型)表示辦理人。  
  7.                 方式二:  
  8.                     AssignmentHandler中  
  9.                     assignable.setAssignee(userId);  
  10.                 方式三:  
  11.                     processEngine.getTaskService().assignTask(taskId, userId);  
  12.             組任務  
  13.                 方式一:指定candidate-users屬性  
  14.                     可以指定爲具體的String(多個人之間用英文的逗號隔開);  
  15.                     也可以指定一個流程變量,會使用計算出的結果(結果要是String型,多個人之間用英文的逗號隔開)表示候選人。  
  16.                 方式二:  
  17.                     AssignmentHandler中  
  18.                     assignable.addCandidateUser(userId); // 添加一個組成員(候選人)  
  19.                 方式三:  
  20.                     processEngine.getTaskService().addTaskParticipatingUser(taskId, userId, Participation.CANDIDATE);  

到這裏,有關AssignmentHandler的問題都差不多了

2.DecisionHandler

DecisionHandler接口的作用就是根據你給傳入的條件進行判斷,然後返回一條讓你往下繼續執行的線,就跟做決定一樣。

  1. public class DaysCheckHandler implements DecisionHandler {  
  2.     
  3.     @Override 
  4.     public String decide(OpenExecution execution) {  
  5.         //加入判斷天數的邏輯  
  6.         String days =execution.getProcessInstance().getVariable("days").toString();  
  7.         float day = Float.parseFloat(days);  
  8.         if(day>3){  
  9.             return "MoreThan3Days";  
  10.         }else{  
  11.             return "LessThan3Days";  
  12.         }  
  13.     }  

獲取前面流過來的"days" 然後返回那條線的名字就OK,XML配置見上文,so easy

這兩個接口還是比較常用的,我用的方式是比較簡單的,但是jbpm比我們想象的靈活多了,尤其是AssignmentHandler,可以加上權限等等,一個實現服務多個用戶我覺得應該也是能實現的,唉~~設計模式沒學好,晚上繼續看!!!

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