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

来源:互联网 发布:淘宝卖家发货流程 编辑:程序博客网 时间:2024/06/05 09:24

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);  //创建TransitionImplTransitionImpl transition = sourceActivity.createOutgoingTransition();  transition.setName("to " +destName);  transition.setDestination(destActivity); //添加TransitionImplsourceActivity.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,这个很好理解。

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


原创粉丝点击