本文旨在讨论,这样一种驳回应用,“你从哪里来,就回到哪里去,我无需知道你从哪里来”
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,实现无需指定上一步骤的节点名称,来实现这种通用型驳回,带来的好处就是,你无需给所有那些需要驳回功能的步骤添加一个独特的回退方法,它们可以共用一个回退方法
长沙废品回收www.0731fphs.com