一步一步学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的时候,指出流转的放心,也就是complete(taskID,outcome),这个outcome就是新建的transition的名称,transition.getName()就行。如果不指定就会报错,因为新建了以后就多出了一条transition,这个很好理解。
自由流程在项目中会经常用到,因为流程定义有时候不会想到所有的流向信息,有了自由流以后就可以轻松的应对流程变化了。
- 一步一步学JBPM(8)——JBPM自由流
- 一步一步学JBPM(1)——JBPM简介
- 一步一步学JBPM(10)——JBPM表单属性
- 一步一步学JBPM(11)——JBPM基础框架
- 一步一步学JBPM(2)——JPDL流程定义语言
- 一步一步学JBPM(3)——JBPM4.4环境搭建
- 一步一步学JBPM(7)——EventListener监听流程信息
- 一步一步学JBPM(9)——流程变量
- 一步一步学JBPM(12)——JBPM流程历史追踪
- 一步一步学JBPM(12)——JBPM流程历史追踪
- 一步一步学JBPM(6)——AssignmentHandler获取流程相关信息
- 一步一步学习jbpm(一)
- 一步一步学JBPM(4)--JBPM和SSH2结合使用jar包详解
- 一步一步学JBPM(4)--JBPM和SSH2结合使用jar包详解
- jBPM专家力作——《深入浅出jBPM》
- jBPM
- jbpm
- jBPM
- CentOS调整桌面分辨率
- Python之——字符串的访问
- 解决XStream对于Null值toXML时不输出标签的问题
- linux中man用法(转)
- 面试常见问题
- 一步一步学JBPM(8)——JBPM自由流
- c#调用DLL
- [企业管理]项目管理的范畴和职能分类——项目是如何崩溃的
- IOS开发学习笔记(1)-----UILabel 详解
- 【NOI2005 Sequence】序列之神Splay和Splay“基础题”Sequence
- MATLAB: OUT OF MEMORY
- 让你的IIS5.1支持PHP
- Servlet工作原理
- oracle静态视图、动态视图、不同状态下可访问的视图