JBPM中Token跟踪
在开启一个实例后,我们需要实时的监控实例现在运行在哪个环节,这个可以通过查询RootToken的状态来实现。
这里就需要考虑fork分支的情况:如果流程执行遇到分支,分创建多个子TOKEN,分开执行。下面是代码
/** * 返回当前活动的TOKEN所在的节点名称 * @param instId * @return */public Set monitInstance(String instId) {JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();try {GraphSession graphSession = jbpmContext.getGraphSession();ProcessInstance instance = graphSession.getProcessInstance(Long.parseLong(instId));Token rooToken = instance.getRootToken();Set<String> set = new HashSet<String>();if (rooToken.hasEnded()) {set.add("END");} else if (rooToken.hasActiveChildren()) {//递归查询TOKEN的子TOKENgetCurrentNodeNames(rooToken, set);} else {set.add(rooToken.getNode().getName());}if (set.contains("END")) {System.out.println("END");}return set;} catch (Exception e) {e.printStackTrace();return new HashSet();} finally {jbpmContext.close();}}代码中,有一行代码,是对有 "活动的子TOKEN的"节点的递归遍历
else if (rooToken.hasActiveChildren()) {//递归查询TOKEN的子TOKENgetCurrentNodeNames(rooToken, set);}下面是递归方法
/** * 递归获取Token中子TOKEN所在节点的名称 * @param parenToken * @param set * @return */private Set getCurrentNodeNames(Token parenToken, Set set) {Iterator<Token> it = parenToken.getChildren().values().iterator();while (it.hasNext()) {Token currentToken = it.next();// 如果还有活动的子节点,说明还未全到达Join节点,需要对所有的节点的所在节点进行记录if (currentToken.hasActiveChildren()) {getCurrentNodeNames(currentToken, set);} else if (!currentToken.hasEnded()) {set.add(currentToken.getNode().getName());}}return set;}在得到一个SET以后,页面部分就可以通过各种方式来显示标记流程实例正在进行的环节了.
over.