在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 >兩個標籤)
- <task assignee="${name}" g="235,146,92,52" name="LeaveApplication">
- <assignment-handler class="com.mtf.jbpm.handler.NewApplicationAssignmentHandler"/> //創建請假單前綁定用戶,員工
- <transition g="-113,-17" name="SubmitApply" to="ManagerApprove"/>
- </task>
- <task assignee="${name}" g="244,235,92,52" name="ManagerApprove">
- <assignment-handler class="com.mtf.jbpm.handler.ManagerApproveAssignmentHandler"/>//當請假單流轉到manager那時觸發,領導
- <transition g="-46,-23" name="ManagerApproved" to="DaysCheck"/>
- <transition g="-15,-35" name="ManagerDisApproved" to="end"/>
- </task>
- <decision g="67,240,48,48" name="DaysCheck">
- <handler class="com.mtf.jbpm.handler.DaysCheckHandler" /> //分支流程
- <transition g="-20,-2" name="LessThan3Days" to="HrMakeSure"/>
- <transition g="-49,-11" name="MoreThan3Days" to="ExecutiveApprove"/>
- </decision>
- 申請請假單的AssignmentHandler
- public class NewApplicationAssignmentHandler implements AssignmentHandler{
- @Override
- public void assign(Assignable assignable, OpenExecution execution)
- throws Exception {
- System.out.println("pxj 創建一leave");
- String name =(String) execution.getVariable("name");
- System.out.println(name);
- assignable.setAssignee(name);
- }
- }
- 領導的AssignmentHandler
- public class ManagerApproveAssignmentHandler implements AssignmentHandler{
- @Override
- public void assign(Assignable assignable, OpenExecution execution)
- throws Exception {
- System.out.println("經理 開始審批");
- String id = (String) execution.getVariable("parentId");
- int managerId = Integer.parseInt(id);
- EmployeeDao employeeDao = new EmployeeDaoImpl();
- Employee e= employeeDao.findEmployeeById(managerId);
- assignable.setAssignee(e.getE_name_cn());
- }
- }
其中parentId是請假單提交的時候設定的,解釋一下:員工提交請假單當然是提交到自己領導那了,於是我在提交請假單的方法中查找了一下自己領導的id,存在這個parentId中,到這裏面在尋找這個人的姓名(領導的名字)通過assignable.setAssignee(e.getE_name_cn()); 將這個Task的執行者設置成領導……於是乎當領導查自己的任務列表時,就能查到自己下屬提交的請假單了
- 這個方法就是提交請假單的方法,應該寫在前面纔對,思路有些混亂……
- /**
- * submitApplication 2012-7-9
- */
- @Override
- public void submitApplication(String actorId, float days,
- ProcessInstance pi, int id) {
- String taskId = processEngine.getTaskService().createTaskQuery()
- .processInstanceId(pi.getId()).uniqueResult().getId();
- // 綁定流程
- // 尋找上級
- LeaveDao dao = new LeaveDaoImpl();
- Leaves leaves = null;
- try {
- List<Leaves> all = dao.queryParentById(id, 1);
- for (int i = 0; i < all.size(); i++) {
- leaves = all.get(i);
- }
- } catch (Exception e) {
- }
- System.out.println("TaskId" + taskId);
- Task tasks = processEngine.getTaskService().getTask(taskId);
- String executionId = tasks.getExecutionId();
- processEngine.getExecutionService().setVariable(executionId,
- "parentId",new String(leaves.getL_emp_id()+""));
- processEngine.getExecutionService().setVariable(executionId, "days",
- days);
- processEngine.getTaskService().completeTask(taskId);
- }
主要接收:流程實例id,創建人姓名,請假人id,本次總結我只想把jbpm的接口總結一下,關於流程的部分請看下部分。
- 實際上任務的分配方式有很多種
- 任務的分類與分配方式
- 任務的分類:
- 個人任務
- 方式一:指定assignee屬性
- 可以指定爲具體的某個String(具體某人);
- 也可以指定一個流程變量,會使用計算出的結果(結果要是String型)表示辦理人。
- 方式二:
- AssignmentHandler中
- assignable.setAssignee(userId);
- 方式三:
- processEngine.getTaskService().assignTask(taskId, userId);
- 組任務
- 方式一:指定candidate-users屬性
- 可以指定爲具體的String(多個人之間用英文的逗號隔開);
- 也可以指定一個流程變量,會使用計算出的結果(結果要是String型,多個人之間用英文的逗號隔開)表示候選人。
- 方式二:
- AssignmentHandler中
- assignable.addCandidateUser(userId); // 添加一個組成員(候選人)
- 方式三:
- processEngine.getTaskService().addTaskParticipatingUser(taskId, userId, Participation.CANDIDATE);
到這裏,有關AssignmentHandler的問題都差不多了
2.DecisionHandler
DecisionHandler接口的作用就是根據你給傳入的條件進行判斷,然後返回一條讓你往下繼續執行的線,就跟做決定一樣。
- public class DaysCheckHandler implements DecisionHandler {
- @Override
- public String decide(OpenExecution execution) {
- //加入判斷天數的邏輯
- String days =execution.getProcessInstance().getVariable("days").toString();
- float day = Float.parseFloat(days);
- if(day>3){
- return "MoreThan3Days";
- }else{
- return "LessThan3Days";
- }
- }
- }
獲取前面流過來的"days" 然後返回那條線的名字就OK,XML配置見上文,so easy
這兩個接口還是比較常用的,我用的方式是比較簡單的,但是jbpm比我們想象的靈活多了,尤其是AssignmentHandler,可以加上權限等等,一個實現服務多個用戶我覺得應該也是能實現的,唉~~設計模式沒學好,晚上繼續看!!!