`

JBPM 实现动态退回路径

    博客分类:
  • JBPM
阅读更多
一般我们设计流程都需要考虑退回问题,这样,较多的转移路径被设计。
我们可以考虑一般简单行的回退问题:即在明确各个流程回退的路径下,我们可以设置动态路径。

如图:




使用了动态回退后




呵呵,相对简单一些。流程也好看一些。
现在分析一下思路:
1.需要设置退回的监听器,在流程运行的时候,自动创建退回的路径
2.封装退回任务的调用。

具体的设计:
1流程设计

在task节点下添加监听器,设置回退路径m_rollbackTo:
 
 <on event="start">
      		<event-listener class="com.shangwang.workFlow.RollbackListener">
      			<field name="m_rollbackTo">
      				<string value="申请"/>
      			</field>
      		</event-listener>
 </on>


2.完成监听器的退回路径创建:
/**
	 * 增加一条用户退回的路径
	 */
	public void notify(EventListenerExecution execution) throws Exception {
		//获取流程定义对象
		ProcessInstance  processInstance = execution.getProcessInstance();
		String processDefinitionId  = processInstance.getProcessDefinitionId();
		ProcessDefinitionImpl processDefinition = (ProcessDefinitionImpl) processEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionId(processDefinitionId).uniqueResult();
		
		//获取退回目的地的活动定义对象
		ActivityImpl toActivityImpl = processDefinition.findActivity(m_rollbackTo);
		
		//退回活动目的地不存在,流程定义错误
		if(null == toActivityImpl){
			String ms  = "in "+processDefinitionId+" no "+ m_rollbackTo;
			throw new Exception(ms);
		}
		//获得当前活动的定义对象
		ActivityImpl fromActivityImpl = ((ExecutionImpl)execution).getActivity();
		
		//建立退回的转移路径
		TransitionImpl transtion = fromActivityImpl.createOutgoingTransition();
		String tranName = fromActivityImpl.getName() + "to " + m_rollbackTo;
		transtion.setName(tranName);
		transtion.setDestination(toActivityImpl);	
		//removeOutgoingTransition(transition);
		
		
		
		
	}


需要注意的是RollbackListener是实现org.jbpm.api.listener.EventListener接口,实现notify()方法。
3.封装退回任务的调用,编写了一个TaskRollbackService的服务:
//获取流程引擎
	private static final ProcessEngine  processEngine = Configuration.getProcessEngine();
	//获取任务服务
	private static final TaskService  taskService = processEngine.getTaskService();
	
	public void completeTaskRollback(String taskId,String rollbackToActName){
		Task task = taskService.getTask(taskId);		
		taskService.completeTask(task.getId(),task.getActivityName()+"to "+rollbackToActName);			
	}



调用的时候注意一下参数传递:taskId是流程ID,rollbackToActName是回退路径!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics