JBPM支持自由流程,所谓的自由流程,就是不在预先定义的JPDL语言中定义的Transition中流转。而是根据客户需要,可以在JBPM中的任意两个借点直接流转,这叫自由流。比如有这么一个流程定义科员-->科长-->主任。三个环节,现在科员看完任务发现没有必要提交给科长,可以直接提交给主任,或者直接提交到END节点,这些需求都是可以实现的,只不过这个实现不是JBPM本来倡导的实现,而是由于在中国社会中不断的需求,有时候人们习惯叫做中国特色的流程,中国特色的流程还包括:会签,驳回,消除痕迹等操作。目前我只用到了驳回和自由流。现在我主要说一下自由流的实现。
使用的是createOutgoingTransition方法,这个方法可以创建一个然后流转。
请看代码:
public void addOutTransition(String destName,String taskId,String sign) {
//这里传递进来的是一个目标节点名称,和任务ID,另一个参数sign大家不用理会,是我特殊用途的一个参数和这个无关。
/*首先根据任务ID获取流程定义,然后再在流程定义上动态添加流转
* 这里传递进来的是一个taskID,我是为了获取流程定义,反正不管你用什么方法,只要能获取到ProcessDefinitionImpl和
*任务Id就行。
*/
Task task = taskService.getTask(taskId);
String sourceName =task.getActivityName().toString();
Execution execution = executionService.findExecutionById(task.getExecutionId());
ProcessDefinitionImpl pd = (ProcessDefinitionImpl) repositoryService.createProcessDefinitionQuery().processDefinitionId(execution.getProcessDefinitionId()).uniqueResult();
//获取到当前任务节点
ActivityImpl sourceActivity = pd.findActivity(sourceName);
//获得目标节点
ActivityImpl destActivity=pd.findActivity(destName);
//创建TransitionImpl
TransitionImpl transition = sourceActivity.createOutgoingTransition();
transition.setName("to " +destName);
transition.setDestination(destActivity);
//添加TransitionImpl
sourceActivity.addOutgoingTransition(transition);
//将流程控制变量,是否正常完成,设置到流程定义实例中
executionService.setVariable(execution.getId(), "sign", sign);
//完成任务
taskService.completeTask(task.getId(),transition.getName());
//删除创建的流转路线,这个一般都会删除一下,防止影响原本流程定义
this.removeOutTransition(pd, sourceName, destName);
}
//删除自由流
public void removeOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName) {
ActivityImpl sourceActivity = pd.findActivity(sourceName);
List<Transition> trans=(List<Transition>) sourceActivity.getOutgoingTransitions();
for(Transition tran:trans){
if(destName.equals(tran.getDestination().getName())){
trans.remove(tran);
break;
}
}
}
这里面其实就是新建了一个流程,使用代码的方式,这样只要知道出发节点的名称,和目标节点的名称就可以在任意两个节点中建立流转。然后再使用complete方法完成任务,这里只需要使用一个complete方法就行,不需要做其它操作,但是记得complete的时候,指出流转的放心,也就是complete(taskID,outcome),这个outcome就是新建的transition的名称,transition.getName()就行。如果不指定就会报错,因为新建了以后就多出了一条transition,这个很好理解。
自由流程在项目中会经常用到,因为流程定义有时候不会想到所有的流向信息,有了自由流以后就可以轻松的应对流程变化了。