在JBPM4流程设计中,让让当前节点回退到该节点以前的任意节点,如图,如果想从task3回到task1,可以使用的方法有:
①创建一个Transition对象,从task3到task1
/**
* 动态创建连接当前任务节点至名称为destName的节点的Transition
* @param taskId 任务节点ID
* @param sourceName 源节点名称
* @param desName 目标节点名称
*/ public void addOutTransition(ProcessDefinitionImpl pd,String sourceName,String desName){
ProcessEngine pe = Configuration.getProcessEngine();
EnvironmentFactory ef =(EnvironmentFactory)pe;
EnvironmentImpl evti = null;
try{
evti = ef.openEnvironment();
ActivityImpl sourceActivity = pd.getActivity(sourceName);
TransitionImpl tran = sourceActivity.createOutgoingTransition();
ActivityImpl desActivity = pd.getActivity(desName);
tran.setName("to"+desName);
tran.setDestination(desActivity);
sourceActivity.addOutgoingTransition(tran);
}catch(Exception e){
e.printStackTrace();
}finally{
if(evti != null)evti.close();
}
}
/**
* 动态删除连接sourceName与destName的Transition
* @param taskId
* @param sourceName
* @param desName
*/
public void removeOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){
EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;
EnvironmentImpl env=null;
try {
env = environmentFactory.openEnvironment();
//取得当前流程的活动定义
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;
}
}
}catch(Exception ex){
}finally{
if(env!=null)env.close();
}
}
这样再通过take()、completeTask()等方法就可以回退了
②调用ProcessEngin.execute()方法
③调用ExecutionImpl.moveTo()方法
推荐使用第一种