jbpm4.4:會籤的實現
最近一直在研究jbpm4.4,在做專案的過程中發現了很多問題,其中的某些問題在網上的資料很多,當然都能夠順利的解決,但是當我實現多人會籤功能的時候,花了
很大精力都沒有找到很好的解決辦法,經過半天時間的編碼測試之後最終還是將其解決了,jbpm4.4會籤的功能在網上的資料很少,這裡我就將我的實現思想闡述出來,
希望對初學者有所幫助。
網上查詢資料的實現程式碼大致如下:
public void assign(Assignable assignable, OpenExecution openExecution)
throws Exception {
String pid = openExecution.getProcessInstance().getId();
Task task = workFlowService.getTaskService().createTaskQuery().processInstanceId(pid)
. activityName(openExecution.getName()).uniqueResult();
createSubTasks(task);
}
public void createSubTasks(Task task) {
// 取得事項定義好的會籤角色列表
list = (List<String>) workFlowService.getTaskService().getVariable(task.getId(), "clerk");
// 為每一個角色動態建立子任務
if(list != null) {
for(String participant : list) {
TaskImpl subTask = (TaskImpl) ((OpenTask)task).createSubTask();
subTask.setAssignee(participant);
subTask.setFormResourceName(task.getFormResourceName());
subTask.setName(task.getName());
subTask.setActivityName(task.getActivityName());
workFlowService.getTaskService().addTaskParticipatingUser(task.getId(), participant, Participation.CLIENT);
}
}
但是以上方式會存在一個問題: 子任務得不到父任務上繫結的變數: 舉個例子說明一下: 如果現在第一個任務節點為申請人,提交表單的時候綁定了 一個表單form的變數
值,而在這裡雖然能動態分配任務,但是在查詢我的任務列表的時候,由於取不到form變數的值,而報空指標異常的錯誤。現在我的解決辦法如下:
public class CounterAssignHandler implements AssignmentHandler {
private String roleName;
private static ProcessEngine processEngine;
private static UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
}
@SuppressWarnings("unchecked")
public void assign(Assignable assignable, OpenExecution execution)
throws Exception {
// TODO Auto-generated method stub
TaskService taskService = processEngine.getTaskService();
String pid=execution.getProcessInstance().getId();
Task task=taskService.createTaskQuery().processInstanceId(pid).activityName(execution.getName()).uniqueResult();
Object value=taskService.getVariable(task.getId(), "form"); //獲得父任務繫結的變數
Map<String,Object> variables=new HashMap<String, Object>();
variables.put("form", value);
List<String> loginNames=userDao.searchUsersOfRole(roleName);
if(loginNames!=null){
for(String actorId:loginNames){
TaskImpl t = (TaskImpl)task; //此處必須將task強制型別轉換為TaskImpl
TaskImpl subTask = t.createSubTask();
subTask.setAssignee(actorId);
subTask.setVariable("form", value); //此處直接將父任務繫結的變數設定到子任務當中
taskService.addTaskParticipatingUser(task.getId(), actorId, Participation.CLIENT);
}
}
}
}
通過這種方式子任務 就可以獲得父任務的變數而實現順利的流轉,此處還特別提醒,在做回退和選擇下一步功能的時候,如果傳遞進來的是任務的taskId,
那麼這裡獲得Task物件之後一定要記得判斷該Task是否存在父任務,如果存在父任務,說明該任務是子任務,子任務在回退和選擇下一步的時候應該是按照
父任務所在的節點來獲得經歷過的歷史任務節點和所有能往下流轉的Transition. 提交子任務的時候,我們首先要通過父任務獲得所有的子任務,然後提交完成
對應的子任務,當完成所有的子任務之後再提交父任務,這樣,流程才能繼續往下流轉。 希望對各位有幫助!