工作流引擎核心调度算法与PetriNet
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有关 PN 我就不详细解释了(懒得重复的敲文字),有兴趣的自己查阅资料。一定要查, 否则这边文章你是看不下去了。
PN 的算法描述本身是很简单的:任何一次 Token 的转移,都会引起对整个流程(在 PN 中叫 Case)的重新使能(enabled)遍历。—— 就像“蝴蝶效应”。
如果上面这句 PN 算法的描述,您并不是很清楚,那么建议你暂停往下阅读。先去查阅一 下有关 PN 的资料,看看先。
接下来,就让我们看看这些开源引擎的核心调度算法。—— 呵呵,没办法了,我只能拿 开源的咚咚来跟大家说说了。这样一不涉及保密,二不涉及泄密。
注:严重 bs 那些修改或一心想着修改开源引擎代码的家伙。
先说说四个非 PetriNet 调度算法的开源引擎
主要说几个大家都比较熟悉的:OBE,Shark,OSWorkflow,jBpm。分析一下他们的调度 算法,就基本上可以知道其能力有多强。
OBE 的引擎调度机制..........................................................................................................4 Shark 的引擎调度机制 ........................................................................................................5 OSWorkflow 的引擎执行机制 ............................................................................................6 JBpm 的引擎执行机制 ........................................................................................................6 再说说两个 PetriNet 调度算法的开源引擎 ...............................................................................9 YAWL 的引擎调度机制 ....................................................................................................10 Bossa 的引擎调度机制(标准的 PN 机) .......................................................................12 结尾 ............................................................................................................................................15
第2页
工作流引擎核心调度算法与 PetriNet
by 胡长城(银狐 999)
前不久,公司这边不得不对工作流引擎进行重构,这个“烫手的山芋”也不得不落在了 我身上。从理论上说,这是一件让我兴奋得事情;但是,从现实角度上,这又是一件让我头 疼的事情(虽然来了有几个月了,但是毕竟这个产品早期不是我做的,很多部分我也不是很 清楚,更烦得是,并没有多少文档):重构已有的产品,是一件危险的事情,成则为王,败为 寇。
声明
此篇并不是针对 workflow 的初学者。如果你对 workflow 不了解,或对篇中的几个 workflow engine(OBE,Shark,OSWorkflow,jBpm,YAWL,Bossa)都不了解的话,那么不 建议您阅读此篇文章。
如果您对 workflow 感兴趣,那么建议你在阅读此篇文档的时候,一边打开这几个开源引 擎的源码,跟着文中的演示片断分析。
对于接手引擎重构这个任务,我并没有百分百的自信能够做好,毕竟短时间内重构一个 自己并不十分了解的引擎,并且涉及到核心的调度算法和调度机制,实在是一个危险的事情。 ——但是最终也不得不这么做,有时候由不得自己。这一个多月来,甚至在深夜入睡的时候, 躺在床上,都在想第二天的重构放案。—— 感觉自己那些日子,真像破釜沉舟。
OBE 的引擎运转调度算法是很简单的,其所有的调度规则都是依据于 WorkflowRunner 类 的 run 方法。采用遍历循环的方式,这个遍历机制就是:
/***** 摘自 WorkflowRunner 类的 run 方法 ****/
while (!_activityStack.isEmpty()) { //_activityStack 中暂存着需要被激活的活动实例 ActivityContext ap = (ActivityContext)_activityStack.pop(); _ctx.setActivityContext(ap.activity, ap.instance); //虽然叫 execute,但是其实际上是一个激活活动实例的行为 executeActivityInstance(ap.activity, ap.instance);
一个月之后,终于给自己了一个较为满意的答复,虽然功能上还有些细节未完善,但是 整个引擎的框架布局、对外接口、内核调度算法和调度机制都基本上重构了一遍。—— 在重 构的时候,更多的压力是来源自“重构出一个良好而又让自己满意的引擎内核”。
当重构基本完结的那天下午,心里也是非常的兴奋。兴奋的实在是不想再写第二行代码, 哈哈。只想坐在电脑前,哼着小曲,悠然自得;当然现实是不允许的。—— 这种兴奋,似乎 压抑了两三年,如今终于让自己重构出一个让自己满意的引擎内核。至少现在,可以对得起 自己这几年在 workflow 上扎下的功夫了。
那么“内核”到底代表什么呢?这内核就是支撑整个引擎运转的内部调度算法、执行推 进机制,以及围绕调度算法的一些 Context、Runner 类,及 kernel 的框架。这内核才是一个引 擎的灵魂。
进入正题
既然说的是调度算法和 PetriNet,那么就有必要先从 PetriNet 说起。 这次重构,将 Petri Net 的算法调度的应用和 XPDL 模型结合起来了。受这边产品早期引 擎建模结构的影响,模型采用的还是扩展 XPDL。其实我对 XPDL 没有多少好感,但是也不得 不承认,XPDL 中有些思想是很不错——还好,模型对引擎的影响并不是很大,真正影响引擎 的是上面所说的“内核”。 重构之前的一些修炼,还有赖于在早先在 Justep 公司的学习。虽然离开有好几个月了, 虽然也只 Jjustep 中待了两个多月,但是在老宋的逼迫下,倒是对 Petri Net 的算法研究的了一 番。依着我自己的性子,是很难自己去深入探索 PetriNet 的(至少之前,我对 PN 不感冒)。
OBE 的引擎调度机制
说到开源引擎,首先就要说一下 OBE,这是最早一款支持 XPDL 的开源工作流引擎。可 惜由于没有良好的持续维护,到如今,虽然 Adrian 依然还在对其进行一些补充和修改,但已 经掩饰不出其“落寞”的容颜了(/james999/category/57982.aspx)。
本文为个人所言,难免会有疏忽遗漏错误之处,望斧正。如有疑问,可来信探讨,我的 信箱:james-fly@ 。
注:转载文章,请注明作者信息。
前言废话
过年之后,一直忙公司这边平台的重构,忙得我连自己的 blog 和主页都很久没有更新, 这两天竟然还发现,我那《工作流之星光》【/mywf/bright】竟然 快两个月未更新了。直到这几日有个小小阶段性的成果,但接下来又将是一轮新的研发。于 是赶紧抓住这宝贵的还不算非常忙的几天,写写心得。
但是,估计绝大多是人,所熟悉的开源引擎的调度机制都不是采用 PN 算法的。比如 OBE, Shark,OSWorkflow,jBpm。—— 当然,有没有采用,对很多人来说,并不关心,他们只关 心如何去用。
第3页
工作流引擎核Biblioteka 调度算法与 PetriNetby 胡长城(银狐 999)
如果你对 workflow 的调度算法不关心,或者只是想去篡改那些开源引擎的代码(这样的 人,大有人在),那么请您停止阅读本篇。因为这篇文章,对你是毫无意义的。
此篇并不是针对 workflow 的初学者,如果您刚刚接触工作流,本人不建议您阅读本篇 更多工作流参考文档,请访问在 注:转载文章,请注明作者信息。
第1页
工作流引擎核心调度算法与 PetriNet
by 胡长城(银狐 999)
目录
声明 ..............................................................................................................................................2 前言废话 ......................................................................................................................................2 进入正题 ......................................................................................................................................3 先说说四个非 PetriNet 调度算法的开源引擎 ...........................................................................4
这一个多月以来,最主要的工作就是把早先这边的工作流产品彻底的“翻”了一把。重 构整个工作流引擎的组件框架和调度算法。也算是对自己这几年来,研究工作流的结果的一 个“挑战性”钻研。
这几年,做过几个工作流产品了,有成型的,有半成品的,但是由于各种各样的原因, 一直没做出一个自己还比较满意的引擎,所以一直也很愧疚。从早期在 huihoo 上做 JFoxFlow, 到后来的退出,也是这种思想。总感觉没有找到一个最“内核”的东西,于是最终还是放弃 了做开源,把更多的时间用来钻研资料。
}
/* 在初始化任何一个活动实例后,将这个活动实例放入_activityStack 这个堆栈
中。然后调用 WorkflowRunner 的 run 方法。在这个方法中,遍历_activityStack 堆 栈中的活动实例,进行运行。 */
但是什么情况下会激活 WorkflowRunner 的 run 呢? StartProcess,startActivity,completeActivity,executeTransition 这些情况下, 都会造成 run 的运行。 OBE 的调度算法是很简单,但是执行这个调度过程,是比较绕的。想弄清楚到底如何运行 的,大家有必要去仔细阅读阅读 WorkflowRunner 类。从 StartProcess 方法开始,跟踪起 startActivity,completeActivity,executeTransition 这几个方法之间的调用关系。 这样的引擎调度机制是比较单一的。将一些控制判断交给了外围的过程。引擎本身并没 有多少实际的调度,只是一个执行体:获取需要执行(激活)的活动实例,然后执行(激活)。
工作流引擎核心调度算法与 PetriNet
by 胡长城(银狐 999)
工作流引擎核心调度算法与 PetriNet
Workflow Kernel and Petri Net
版本:1.0
作者 :胡长城 [ 银狐 999 ] /james999 完成日期:2005-4-17 version 1.0 联系信箱:james-fly@ MSN :fcxiao2000@
PN 的算法描述本身是很简单的:任何一次 Token 的转移,都会引起对整个流程(在 PN 中叫 Case)的重新使能(enabled)遍历。—— 就像“蝴蝶效应”。
如果上面这句 PN 算法的描述,您并不是很清楚,那么建议你暂停往下阅读。先去查阅一 下有关 PN 的资料,看看先。
接下来,就让我们看看这些开源引擎的核心调度算法。—— 呵呵,没办法了,我只能拿 开源的咚咚来跟大家说说了。这样一不涉及保密,二不涉及泄密。
注:严重 bs 那些修改或一心想着修改开源引擎代码的家伙。
先说说四个非 PetriNet 调度算法的开源引擎
主要说几个大家都比较熟悉的:OBE,Shark,OSWorkflow,jBpm。分析一下他们的调度 算法,就基本上可以知道其能力有多强。
OBE 的引擎调度机制..........................................................................................................4 Shark 的引擎调度机制 ........................................................................................................5 OSWorkflow 的引擎执行机制 ............................................................................................6 JBpm 的引擎执行机制 ........................................................................................................6 再说说两个 PetriNet 调度算法的开源引擎 ...............................................................................9 YAWL 的引擎调度机制 ....................................................................................................10 Bossa 的引擎调度机制(标准的 PN 机) .......................................................................12 结尾 ............................................................................................................................................15
第2页
工作流引擎核心调度算法与 PetriNet
by 胡长城(银狐 999)
前不久,公司这边不得不对工作流引擎进行重构,这个“烫手的山芋”也不得不落在了 我身上。从理论上说,这是一件让我兴奋得事情;但是,从现实角度上,这又是一件让我头 疼的事情(虽然来了有几个月了,但是毕竟这个产品早期不是我做的,很多部分我也不是很 清楚,更烦得是,并没有多少文档):重构已有的产品,是一件危险的事情,成则为王,败为 寇。
声明
此篇并不是针对 workflow 的初学者。如果你对 workflow 不了解,或对篇中的几个 workflow engine(OBE,Shark,OSWorkflow,jBpm,YAWL,Bossa)都不了解的话,那么不 建议您阅读此篇文章。
如果您对 workflow 感兴趣,那么建议你在阅读此篇文档的时候,一边打开这几个开源引 擎的源码,跟着文中的演示片断分析。
对于接手引擎重构这个任务,我并没有百分百的自信能够做好,毕竟短时间内重构一个 自己并不十分了解的引擎,并且涉及到核心的调度算法和调度机制,实在是一个危险的事情。 ——但是最终也不得不这么做,有时候由不得自己。这一个多月来,甚至在深夜入睡的时候, 躺在床上,都在想第二天的重构放案。—— 感觉自己那些日子,真像破釜沉舟。
OBE 的引擎运转调度算法是很简单的,其所有的调度规则都是依据于 WorkflowRunner 类 的 run 方法。采用遍历循环的方式,这个遍历机制就是:
/***** 摘自 WorkflowRunner 类的 run 方法 ****/
while (!_activityStack.isEmpty()) { //_activityStack 中暂存着需要被激活的活动实例 ActivityContext ap = (ActivityContext)_activityStack.pop(); _ctx.setActivityContext(ap.activity, ap.instance); //虽然叫 execute,但是其实际上是一个激活活动实例的行为 executeActivityInstance(ap.activity, ap.instance);
一个月之后,终于给自己了一个较为满意的答复,虽然功能上还有些细节未完善,但是 整个引擎的框架布局、对外接口、内核调度算法和调度机制都基本上重构了一遍。—— 在重 构的时候,更多的压力是来源自“重构出一个良好而又让自己满意的引擎内核”。
当重构基本完结的那天下午,心里也是非常的兴奋。兴奋的实在是不想再写第二行代码, 哈哈。只想坐在电脑前,哼着小曲,悠然自得;当然现实是不允许的。—— 这种兴奋,似乎 压抑了两三年,如今终于让自己重构出一个让自己满意的引擎内核。至少现在,可以对得起 自己这几年在 workflow 上扎下的功夫了。
那么“内核”到底代表什么呢?这内核就是支撑整个引擎运转的内部调度算法、执行推 进机制,以及围绕调度算法的一些 Context、Runner 类,及 kernel 的框架。这内核才是一个引 擎的灵魂。
进入正题
既然说的是调度算法和 PetriNet,那么就有必要先从 PetriNet 说起。 这次重构,将 Petri Net 的算法调度的应用和 XPDL 模型结合起来了。受这边产品早期引 擎建模结构的影响,模型采用的还是扩展 XPDL。其实我对 XPDL 没有多少好感,但是也不得 不承认,XPDL 中有些思想是很不错——还好,模型对引擎的影响并不是很大,真正影响引擎 的是上面所说的“内核”。 重构之前的一些修炼,还有赖于在早先在 Justep 公司的学习。虽然离开有好几个月了, 虽然也只 Jjustep 中待了两个多月,但是在老宋的逼迫下,倒是对 Petri Net 的算法研究的了一 番。依着我自己的性子,是很难自己去深入探索 PetriNet 的(至少之前,我对 PN 不感冒)。
OBE 的引擎调度机制
说到开源引擎,首先就要说一下 OBE,这是最早一款支持 XPDL 的开源工作流引擎。可 惜由于没有良好的持续维护,到如今,虽然 Adrian 依然还在对其进行一些补充和修改,但已 经掩饰不出其“落寞”的容颜了(/james999/category/57982.aspx)。
本文为个人所言,难免会有疏忽遗漏错误之处,望斧正。如有疑问,可来信探讨,我的 信箱:james-fly@ 。
注:转载文章,请注明作者信息。
前言废话
过年之后,一直忙公司这边平台的重构,忙得我连自己的 blog 和主页都很久没有更新, 这两天竟然还发现,我那《工作流之星光》【/mywf/bright】竟然 快两个月未更新了。直到这几日有个小小阶段性的成果,但接下来又将是一轮新的研发。于 是赶紧抓住这宝贵的还不算非常忙的几天,写写心得。
但是,估计绝大多是人,所熟悉的开源引擎的调度机制都不是采用 PN 算法的。比如 OBE, Shark,OSWorkflow,jBpm。—— 当然,有没有采用,对很多人来说,并不关心,他们只关 心如何去用。
第3页
工作流引擎核Biblioteka 调度算法与 PetriNetby 胡长城(银狐 999)
如果你对 workflow 的调度算法不关心,或者只是想去篡改那些开源引擎的代码(这样的 人,大有人在),那么请您停止阅读本篇。因为这篇文章,对你是毫无意义的。
此篇并不是针对 workflow 的初学者,如果您刚刚接触工作流,本人不建议您阅读本篇 更多工作流参考文档,请访问在 注:转载文章,请注明作者信息。
第1页
工作流引擎核心调度算法与 PetriNet
by 胡长城(银狐 999)
目录
声明 ..............................................................................................................................................2 前言废话 ......................................................................................................................................2 进入正题 ......................................................................................................................................3 先说说四个非 PetriNet 调度算法的开源引擎 ...........................................................................4
这一个多月以来,最主要的工作就是把早先这边的工作流产品彻底的“翻”了一把。重 构整个工作流引擎的组件框架和调度算法。也算是对自己这几年来,研究工作流的结果的一 个“挑战性”钻研。
这几年,做过几个工作流产品了,有成型的,有半成品的,但是由于各种各样的原因, 一直没做出一个自己还比较满意的引擎,所以一直也很愧疚。从早期在 huihoo 上做 JFoxFlow, 到后来的退出,也是这种思想。总感觉没有找到一个最“内核”的东西,于是最终还是放弃 了做开源,把更多的时间用来钻研资料。
}
/* 在初始化任何一个活动实例后,将这个活动实例放入_activityStack 这个堆栈
中。然后调用 WorkflowRunner 的 run 方法。在这个方法中,遍历_activityStack 堆 栈中的活动实例,进行运行。 */
但是什么情况下会激活 WorkflowRunner 的 run 呢? StartProcess,startActivity,completeActivity,executeTransition 这些情况下, 都会造成 run 的运行。 OBE 的调度算法是很简单,但是执行这个调度过程,是比较绕的。想弄清楚到底如何运行 的,大家有必要去仔细阅读阅读 WorkflowRunner 类。从 StartProcess 方法开始,跟踪起 startActivity,completeActivity,executeTransition 这几个方法之间的调用关系。 这样的引擎调度机制是比较单一的。将一些控制判断交给了外围的过程。引擎本身并没 有多少实际的调度,只是一个执行体:获取需要执行(激活)的活动实例,然后执行(激活)。
工作流引擎核心调度算法与 PetriNet
by 胡长城(银狐 999)
工作流引擎核心调度算法与 PetriNet
Workflow Kernel and Petri Net
版本:1.0
作者 :胡长城 [ 银狐 999 ] /james999 完成日期:2005-4-17 version 1.0 联系信箱:james-fly@ MSN :fcxiao2000@