dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>java>开源框架>文章内容
JBPM工作流引擎内核设计思想及构架3
来源: 作者:

public Token(ProcessInstance processInstance) {
this.processInstance = processInstance;
this.node = processInstance.getProcessDefinition().getStartState();
 


jbpm是允许在start-state执行Task的,也允许在start-state创建工人任务。不过此处我们不予讨论。

7.2 Token的推进

 当Token已经在Start-State节点了,我们可以开始往前推进,来促使流程实例往前运行。对于外部操作来说,触发流程实例往下运行的操作有两个:
 (1) 强制执行ProcessInstance的signal操作
 (2) 执行TaskInstance的end操作。
 但是,这两个操作,都是通过“当前token的signal操作”来内部实现的,如下图所示:

 
 Token的Signal操作表示:实例需要离开当前token所在的节点,转移到下一个节点上。因为Node与Node之间是“Transition”这个桥梁,所以,在转移过程中,会首先把Token放入相关连的Transtion对象中,再由Transition对象把Token交给下一个节点。
让我们来看看Token类中signal方法的部分代码实现,仅供参考:

public void signal() {
//注意ExecutionContext对象
signal(node.getDefaultLeavingTransition(), new ExecutionContext(this));
}

void signal(Transition transition, ExecutionContext executionContext) {
// start calculating the next state
node.leave(executionContext, transition);
}
 

接下来,请注意node.leave()这个操作。这是一个很有意思的语义转换:我们是采用token的signal操作来表示往下一个节点推进,但是实际确实执行的node.leave ()操作。

 如果这地方让你自己来实现,代码会不会就是这样子呢?不妨此处想一想。

//假设代码,仅供思考
void signal(Transition transition, ExecutionContext executionContext) {
transition.take(executionContext);

前面说过,jbpm的调度机制吸纳的Petri Net的思想。在Petri Net中,并没有transition中驻留token这个语义,token只驻留在库所(Place)中。所以,jbpm此处的设计思路,是于此有一定关系的。所以只是把一个ExecutionContext对象放在了transition中,而不是一个token对象。

 让我们来看看node对象的leave方法:

public void leave(ExecutionContext executionContext, Transition transition) {
Token token = executionContext.getToken();
token.setNode(this);
executionContext.setTransition(transition);
executionContext.setTransitionSource(this);
transition.take(executionContext);

我们直接跟踪进Transition的take操作:

public void take(ExecutionContext executionContext) {
executionContext.getToken().setNode(null);
// pass the token to the destinationNode node
to.enter(executionContext);

经过这么多的中间步骤,我们终于把ExecutionContext对象从一个node转移到下一个node了。让我们来看看Node对象的enter操作:

public void enter(ExecutionContext executionContext) {
Token token = executionContext.getToken();
token.setNode(this);
// remove the transition references from the runtime context
executionContext.setTransition(null);
executionContext.setTransitionSource(null);

// execute the node
if (isAsync) {

} else {
execute(executionContext);
}

至此,jBpm成功的从一个节点转移到下一个节点了。—— 这就是jbpm的调度机制。

7.3 非常简单的调度机制

 怎么样,是不是非常的简单?
 让我们把整个过程,用一张更清晰的“思维图”来展示一下:


 8 jBpm的过程执行机制

 8.1 执行机制

 前面我们的“过程调度机制”是为了让流程可以正确的从“一个节点转移到下一个节点”,而本节所要讲解的jbpm“执行机制”,则是为提供一个运行机制,来保证“节点的正确执行”。

 首先我们需要明确如下的概念:
 (1) 节点有很多中,每种节点的执行方式肯定是不一样的
 (2) 节点有自己的生命周期,不同的生命周期阶段,所处的状态不同。


文章出处:http://www.diybl.com/course/3_program/java/javajs/2008325/107306_3.html


上一篇:JBPM工作流引擎内核设计思想及构架2   下一篇:JBPM工作流引擎内核设计思想及构架4
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·关于JSF和Struts的讨论
·Struts教程-Struts模块化编程教
·Struts入门经验
·用科学的思维方法指导软件的设计
·Hibernate配置文件中映射元素详
·Spring中事件处理的小技巧
·struts2.0pring2.0 hibernate3.2
·struts2.0 spring2.0 hibernate3
·浅谈hibernate lazy fetch
·Hibernate的Fetch
·优化hibernate性能的几点建议
·Hibernate中的取策略延迟加载
  相关文章
·JBPM工作流引擎内核设计思想及构
·JBPM工作流引擎内核设计思想及构
·JBPM工作流引擎内核设计思想及构
·Spring 2.5 标注开发的简单例子
·Spring 2.5架构图
·使用 Spring 2.5 TestContext 测
·Apache DBUtils实践
·观察者(Observer)模式优缺点
·Common Dbutils组件的使用
·命令模式的实现要点
·利用Jakarta Commons组件beanuti
·命令模式的优缺点
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763