JBPM4 流程回退实现方法

在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()方法 
推荐使用第一种

猜你喜欢

转载自zw1127.iteye.com/blog/1901494