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的子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);
}


下面是递归方法
/**
* 递归获取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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值