一步一步学JBPM(8)——JBPM自由流

JBPM支持自由流程,所谓的自由流程,就是不在预先定义的JPDL语言中定义的Transition中流转。而是根据客户需要,可以在JBPM中的任意两个借点直接流转,这叫自由流。比如有这么一个流程定义科员-->科长-->主任。三个环节,现在科员看完任务发现没有必要提交给科长,可以直接提交给主任,或者直接提交到END节点,这些需求都是可以实现的,只不过这个实现不是JBPM本来倡导的实现,而是由于在中国社会中不断的需求,有时候人们习惯叫做中国特色的流程,中国特色的流程还包括:会签,驳回,消除痕迹等操作。目前我只用到了驳回和自由流。现在我主要说一下自由流的实现。

1:自由流的原理就是在代码中创建一条Transition

使用的是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);
}

2:删除新建的自由流扭转

//删除自由流
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的时候,指出流转的放心,也就是completetaskID,outcome),这个outcome就是新建的transition的名称,transition.getName()就行。如果不指定就会报错,因为新建了以后就多出了一条transition,这个很好理解。

自由流程在项目中会经常用到,因为流程定义有时候不会想到所有的流向信息,有了自由流以后就可以轻松的应对流程变化了。


你可能感兴趣的:(String,jbpm,语言,任务,transition)