任務回退的工做能夠有兩種實現方式: java
1. 完成當前任務,產生新的後退任務 測試
2. 不須要完成當前任務,讓當前任務直接指向後退的節點。 spa
第一種方式,是joffice1提供的實現,其實現原理就須要有一個completeTask與newTask的動做。在jbpm4的流程歷史中有記錄這個跳轉的過程, .net
第二種方式是joffice2提供的實現,其沒有ComplteTask與newTask的動做,只有changeTaskDefintion與change assignee的動做。 code
如下爲其實現的代碼細節,測試過能夠使用, 對象
/** * 從當前任務跳回上一任務 * @param curTask 當前任務對象 * @param preTaskName 前一任務名稱 * @param assignee 前一任務執行人ID * @return */ public Task jumpToPreTask(Task curTask,String preTaskName,String assignee){ EnvironmentImpl env=null; try{ TaskImpl task=(TaskImpl)curTask; env=((EnvironmentFactory) processEngine).openEnvironment(); ProcessInstance pi=getProcessInstanceByTaskId(curTask.getId()); ProcessDefinitionImpl pd=(ProcessDefinitionImpl)getProcessDefinitionByTaskId(curTask.getId()); TaskDefinitionImpl taskDef= pd.getTaskDefinition(preTaskName); //更換其Execution ExecutionImpl exeImpl=(ExecutionImpl)pi; //更換其活動的定義 Activity preActivity=pd.findActivity(preTaskName); exeImpl.setActivity(preActivity); task.setActivityName(preTaskName); task.setName(preTaskName); task.setDescription(preTaskName); task.setExecution(exeImpl); //更換執行人 task.setAssignee(assignee); task.setCreateTime(new Date()); task.setSignalling(true); //task.setNew(true); //更換流程任務的定義 if(taskDef!=null){ task.setTaskDefinition(taskDef); }else{ //查看其是否爲開始任務,這表示開始任務TODO //String startName=jbpmService.getStartNodeName(); TaskDefinitionImpl taskDefinition = new TaskDefinitionImpl(); taskDefinition.setName(preTaskName); taskDefinition.setPriority(1); taskDefinition.setProcessDefinition(pd); ActivityImpl startActivityImpl=pd.findActivity(preTaskName); ActivityImpl startTaskImpl=pd.createActivity(); startTaskImpl.setName(preTaskName); List outTrans=new ArrayList(); outTrans.addAll(startActivityImpl.getOutgoingTransitions()); startTaskImpl.setOutgoingTransitions(outTrans); } taskService.saveTask(task); return task; }finally{ if(env!=null)env.close(); } }
第二種方式在Jbpm4的歷史表中並無記錄,但咱們能夠不用jbpm4自帶的流程歷史,能夠加上咱們本身的流程歷史,這以下圖所示: ip
目前存在的問題就是不能退回至開始節點,不過有一想法就是能夠讓動態建立一任務爲開始任務,讓流程退回這裏,但惋惜的是,退回是能夠,不過再讓它往下走的話,就會出現節點類型不能轉化的錯誤。 get