JBPM4.4实现一种无需指定上一节点(previous activity)的流程驳回(回退)

本文旨在讨论,这样一种驳回应用,“你从哪里来,就回到哪里去,我无需知道你从哪里来”

JBPM4的驳回通过动态生成Transition来实现,但是在生成这个Transition的时候是需要设置source(源)和destination(目标),也就是说如果要回退到原来的节点,你必须清楚的知道原来的节点的名字,将其设置为这个 Transition的“目标”即可。那么,能不能实现“你从哪里来,就回到哪里去”无需指定上一节点的名称的应用呢?请看:

 

/**
 * “驳回”任务命令
 * 该驳回命令优点在于无需指定上一步骤的节点名称(previous activity),只能用于那些只有一条返回路径的回退应用场景
 * @author ningjinlin
 *
 */
public class RegectTaskSingleBackWayCmd extends AbstractCommand<String>{

	private static final long serialVersionUID = 3407992369612709993L;

	private String taskId;
	
	public RegectTaskSingleBackWayCmd(String taskId) {
		super();
		this.taskId = taskId;
	}
	
	@Override
	public String execute(Environment env) throws Exception {
		TaskService taskService = env.get(TaskService.class);
		TaskImpl currentTask = (TaskImpl)taskService.getTask(taskId);
		ExecutionImpl exec = currentTask.getProcessInstance();
		//获取当前任务的活动节点
		ActivityImpl currentActivity = exec.getActivity();
		//获取该活动节点的IncomingTransition
		TransitionImpl incomingTransition = (TransitionImpl)currentActivity.getIncomingTransitions().get(0);
		//获取IncomingTransition的源活动节点
		ActivityImpl sourceActivity = incomingTransition.getSource();
		
		TransitionImpl backTransition = currentActivity.createOutgoingTransition();
		
		//当前活动节点为新的回退Transition的源,而原来的“源”活动节点变成了目标活动节点
		backTransition.setSource(currentActivity);
		backTransition.setDestination(sourceActivity);
		backTransition.setName("regect "+incomingTransition.getName());
		taskService.completeTask(taskId,backTransition.getName());
		return sourceActivity.getName();
	}

}

 

 

 在你的Service方法中调用proccessEngine.execute(new RegectTaskSingleBackWayCmd(taskId));
通过获取当前任务实例的Activity的IncomingTransition,从而获取到Source Activity,实现无需指定上一步骤的节点名称,来实现这种通用型驳回,带来的好处就是,你无需给所有那些需要驳回功能的步骤添加一个独特的回退方法,它们可以共用一个回退方法

 

 

JBPM4.4实现一种无需指定上一节点(previous activity)的流程驳回(回退)_第1张图片

 

长沙废品回收www.0731fphs.com

 

你可能感兴趣的:(活动)