这里就需要考虑fork分支的情况:如果流程执行遇到分支,分创建多个子TOKEN,分开执行。下面是代码
Java代码
- /**
- * 返回当前活动的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的子TOKEN
- getCurrentNodeNames(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的子TOKEN
- getCurrentNodeNames(rooToken, set);
- }
下面是递归方法
Java代码
- /**
- * 递归获取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以后,页面部分就可以通过各种方式来显示标记流程实例正在进行的环节了.