jbpm 里的Tokenjbpm是什么么?翻译是...

在开启一个实例后,我们需要实时的监控实例现在运行在哪个环节,这个可以通过查询RootToken的状态来实现。
这里就需要考虑fork分支的情况:如果流程执行遇到分支,分创建多个子TOKEN,分开执行。下面是代码
* 返回当前活动的TOKEN所在的节点名称
* @param instId
public Set monitInstance(String instId) {
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
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);
set.add(rooToken.getNode().getName());
if (set.contains("END")) {
System.out.println("END");
} 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
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());
在得到一个SET以后,页面部分就可以通过各种方式来显示标记流程实例正在进行的环节了.
浏览: 13493 次
来自: 济南
zhangli123123 写道你确定这样行吗?我试了这两种方 ...
孙宁振 写道
嘿嘿 加你一下。
哇,谢了,正好遇到这个问题,jboss6里面也是需要拷贝所有的 ...
你确定这样行吗?我试了这两种方式,这两种方式都不行jbpm的Token,node - 王朝网络 -
分享&&当前位置: &&&&&&&&jbpm的Token,node&&&  Token??  jbpm中最重要的概念,应该是令牌(Token)和信令(Signal)   ??  ??在整个流程实例运行过程中,我们可以迅速的利用token得到其当前的current state。在解决&并行&等(比如Fork)问题时,jBpm让Token对象维护了父子关系,这种关系在涉及到Fork的时候会产生。 jBpm让Token这个对象身兼了多种使命:(1)快速定位current state (2)用于fork,join算法 (3)用于告知任务执行者的任务索引。   ??  ??如下代码:   ??  ??//pd是process definition,pi是process instance ProcessInstance   ??  ??pi = new ProcessInstance( pd );   ??  ??//得到根令牌   ??  ??Token token = pi.getRootToken();   ??  ??//发信令   ??  ??token.signal();   ??  ??Token的signal方法也可以传入transition参数,这个方法把信令发送给Token,这样,令牌将被激活,并沿指定的transition离开当前的状态(如果没有指定transition,将沿缺省的transition 离开当前状态).   ??  ??jbpm是怎么实现的呢?其实很简单:   ??  ??1)Token记录了当前的状态(current state),只有当前的状态(或称节点)拥有该令牌   ??  ??2)向TOKEN发signal后,当前状态收到该signal   ??  ??3)当前状态把令牌传给signal中指定的transition   ??  ??4)transition收到令牌后,不强占,马上把令牌传给下个状态.   ??  ??5)根据令牌的位置,流程的状态已经发生改变.   node   ??一个流程图由许多node和transition组成。每个node都有一种类型,这个类型决定了当流程执行到这个node时的不同行为。jbpm有一组node type可以供你选择,当然你可以定制自己node 。   ??node的作用   ??node有两个主要的作用:   ??1)执行java代码,比如说创建task instance(任务实例)、发出通知、更新数据库等等。很典型的就是在node 上挂上我们的action   ??2) 控制流程的执行:   ??A、等待状态   ??流程进入到这个node时将处于等待状态,直到一个signal 的发出   ??B、流程将沿着一个leaving transition越过这个node   ??这种情况特殊一点,需要有个action挂在这个node上(注意这个action不是event触发的!),action中将会调用到API里   ??executionContext.leaveNode(String transitionName),transitionName即这里的leaving transition名字。   ??C、创建新的执行路径   ??很典型的就是fork node。流程在这里会分叉,产生新的执行路径。这样就创建了新的token,每个新的token代表一个新的执行路径。注意的是,这些新的token和产生前的token是父子关系!   ??D、结束执行路径   ??一个node可以结束一条执行路径,这同样意味着相应的token的结束和流程的结束。&&&&&&&今日推荐&&&&&&日版宠物情人2017的插曲,很带节奏感,日语的,女生唱的。
最后听见是在第8集的时候女主手割伤了,然后男主用嘴帮她吸了一下,插曲就出来了。
歌手:Def...老钟家的两个儿子很特别,就是跟其他的人不太一样,魔一般的执着。兄弟俩都到了要结婚的年龄了,不管自家老爹怎么磨破嘴皮子,兄弟俩说不娶就不娶,老父母为兄弟两操碎了心...把牛仔裤磨出有线的破洞
1、具体工具就是磨脚石,下面垫一个硬物,然后用磨脚石一直磨一直磨,到把那块磨薄了,用手撕开就好了。出来的洞啊很自然的。需要猫须的话调几...先来看下敬业福和爱国福
今年春节,支付宝再次推出了“五福红包”活动,表示要“把欠大家的敬业福都还给大家”。
今天该活动正式启动,和去年一样,需要收集“五福”...有时候我们打开冰箱就会闻到一股异味,冰箱里的这种异味是因为一些物质发出的气味的混合体,闻起来让人恶心。 产生这些异味的主要原因有以下几点。
1、很多人有这种习...?&?&?&?&&&&&&Token??
jbpm中最重要的概念,应该是令牌(Token)和信令(Signal)
??在整个流程实例运行过程中,我们可以迅速的利用token得到其当前的current state。在解决&并行&等(比如Fork)问题时,jBpm让Token对象维护了父子关系,这种关系在涉及到Fork的时候会产生。 jBpm让Token这个对象身兼了多种使命:(1)快速定位current state (2)用于fork,join算法 (3)用于告知任务执行者的任务索引。
??如下代码:
??//pd是process definition,pi是process instance ProcessInstance
??pi = new ProcessInstance( pd );
??//得到根令牌
??Token token = pi.getRootToken();
??//发信令
??token.signal();
??Token的signal方法也可以传入transition参数,这个方法把信令发送给Token,这样,令牌将被激活,并沿指定的transition离开当前的状态(如果没有指定transition,将沿缺省的transition 离开当前状态).
??jbpm是怎么实现的呢?其实很简单:
??1)Token记录了当前的状态(current state),只有当前的状态(或称节点)拥有该令牌
??2)向TOKEN发signal后,当前状态收到该signal
??3)当前状态把令牌传给signal中指定的transition
??4)transition收到令牌后,不强占,马上把令牌传给下个状态.
??5)根据令牌的位置,流程的状态已经发生改变.
??一个流程图由许多node和transition组成。每个node都有一种类型,这个类型决定了当流程执行到这个node时的不同行为。jbpm有一组node type可以供你选择,当然你可以定制自己node 。
??node的作用
??node有两个主要的作用:
??1)执行java代码,比如说创建task instance(任务实例)、发出通知、更新数据库等等。很典型的就是在node 上挂上我们的action
??2) 控制流程的执行:
??A、等待状态
??流程进入到这个node时将处于等待状态,直到一个signal 的发出
??B、流程将沿着一个leaving transition越过这个node
??这种情况特殊一点,需要有个action挂在这个node上(注意这个action不是event触发的!),action中将会调用到API里
??executionContext.leaveNode(String transitionName),transitionName即这里的leaving transition名字。
??C、创建新的执行路径
??很典型的就是fork node。流程在这里会分叉,产生新的执行路径。这样就创建了新的token,每个新的token代表一个新的执行路径。注意的是,这些新的token和产生前的token是父子关系!
??D、结束执行路径
??一个node可以结束一条执行路径,这同样意味着相应的token的结束和流程的结束。&&&&&  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。&&&&为你推荐&&&转载本文&UBB代码&HTML代码复制到剪贴板...&更多内容??????????&&热帖排行&&&频道精选&&王朝女性&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝分栏&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝编程&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝导购&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&王朝其他&&|&&|&&|&&|&&|&&|&&&&2005-&&版权所有&温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
乐观、充满活力、
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(132)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'jbpm中的token,signal',
blogAbstract:'最近在学习jbpm,现关注到概念token和signal 这里搜集了下有以下描述 token:令牌;signal:信令。 \ntoken:在jbpm中,一个运行标记token代表一个processDefinintion中的一次执行,它是运行时的概念,用来维护流程设计图中结点的指针。token需要一个信号(signal)来让流程向前执行。当接收到一个signal的时候,token会通过路径(弧transition)离开当前所在的结点到达下一个结点。 \nProcessDefinintion代表一个面向图的业务流程定义。在流程定义中,每一个结点的定义都有一个特定的类型,代表着不同的执行功能。如定义中的Start \nState,这个start state就是一个类型。 \nProcessInstance一个流程实例代表某一个流程定义的一次执行。一个流程定义可以有',
blogTag:'jbpm,taken,signal',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:0,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'乐观、充满活力、',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

参考资料

 

随机推荐