揭秘jbpm流程引擎内核设计思想及构架_第1页
揭秘jbpm流程引擎内核设计思想及构架_第2页
揭秘jbpm流程引擎内核设计思想及构架_第3页
揭秘jbpm流程引擎内核设计思想及构架_第4页
揭秘jbpm流程引擎内核设计思想及构架_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.:.;揭秘jbpm流程引擎内核设计思想及构架 -作者 胡长城 前言 流程引擎内核仅是“满足Process根本运转的最微小构造,而整个引擎那么要复杂很多,包括“形状存储、“事件处置、“组织适配、“时间调度、“音讯效力等等外围的效力性功能。引擎内核,仅包含最根本的对象和效力,以及用于处理流程运转问题的调度机制和执行机制。假设,他掌握了一个流程引擎的灵魂,他才有才干了解它的全部。否那么,一个引擎对他来说,能够只是一个复杂的构造,丰富多彩API、令人眼花缭乱的“功能和“效力而已。本身任务流这个领域就是一个很“狭窄的领域,国内的厂商也不是很多,其中有部分实现技术并不弱。但能够涉于平安等要素,并没有多少

2、技术人员讨论“深度的任务流技术实现问题。而宽广的开发喜好者却还在破费大量的时间在探求“如何了解任务流、如何运用任务流。 所以在此之前,国内尚未有一篇技术文章讨论任务流引擎内核的实现,当然也没有讨论jBpm引擎内核的文章了。在javaeye 技术站点和我的 对于这方面的技术分享,开源是个不错的突破口。 本篇就是以jBpm为实例,来诠释任务流引擎的内核设计思绪和构造。但是这仅仅是从jBpm的实现角度来辅助大家了解,由于任务流引擎内核的设计、实现是有很多方式:这会因所选的模型、调度算法、推进机制、形状变化机制、执行机制等多方面的不一样,而会差别很大。比如基于Activity Diagram模型的jB

3、pm和基于FSM模型的OSWorkflow引擎内核之间就有很大的差别。相比较而言,jBpm的模型比较复杂,而引擎内核实现的比较“精简,非常便于大家“由浅入深的了解。2.1 概念的根底本文的读者群主要是面向有一定任务流根本概念的开发人员。所以本文以为他曾经具备了如下根本任务流知识:1初步了解任务流系统构造。比如了解任务流引擎在任务流系统中所处的位置和作用2对流程定义Process Definition和流程实例Process Instance相关对象有所了解。比如了解Process Instance代表什么,任务项WorkItem代表什么。2.2 环境的根底 在阅读本篇的时候,假设他曾经搭建了一

4、套jbpm的开发环境,那么将有助于他更容易了解本篇的很多内容,也便于实践体验代码。从官方网站下载jbpm-starters-kit开发包,按照其参考手册,可以很容易在eclipse开发环境中建立工程,效果图类似如下:3 什么是流程引擎内核? 我比较推崇“微内核的流程引擎构架,并在最近两三年内写了两篇讨论此方面的文章:第一篇是写于05年7月份的,第二篇是07年7月份的受普元杂志约稿所写,尚未对外公开。 但至今对外论述引擎内核究竟是什么。 正如上面的两张图所示,我们可以经过“微内核的构架来使得流程引擎的构造更加“明晰。而能否实现“微内核的根本,那么是看他能否可以设计并笼统出“良好的

5、引擎内核构造。 很显然,要想设计出一套构造优良的引擎内核,首要条件就是:明白什么是引擎内核。 首先我们需求明白引擎是什么,引擎可以做什么。这在WfMC的中曾经有很详细的解答,本文不再反复。知道这个仅仅是不够的,他还需求很明晰的明白如何去“为流程建模,而这那么在Aalst巨匠所著的一书有细致论述,本文也不再反复。 但很惋惜,至今尚未有一本专门的书籍来论述“过程建模方法的,或者说如何利用这些既有的“过程建模方法诸如FSM、PetriNet、EPC、Activity Diagram等等来处理流程问题。这个只能分别查阅相关资料,此处也不表达。 由于文本只讲“引擎内核。 假设我们暂且把那复杂的流程业务性

6、问题,诸如“组织模型分配、“分支条件计算、“事件处置、“音讯调度、“任务项处置、“存储、“运用途置、以及那些“变态的诸如会签、回退之类的模型都统统的丢弃,只留下“最单纯的过程性问题,也就是“处理一个过程运转问题,按次序的从一个节点到另一个节点的执行。这就是引擎内核所关注的根本问题。 上面这句话,估计会引起很多人“拍砖。在很多人看来,任务流之所以看起来很“难,就是由于这些复杂多变的“业务性问题都统统绑在一个“引擎上呵斥的。 其实,这是两个“维度的问题,也就是“引擎的笼统和“引擎的运用这两个不同维度,不同层面的问题。但这绝不是两个独立的问题,“引擎的笼统的好与坏,直接影响到“引擎的运用的可复杂度和

7、可支持度,当然我们也不能否认,“引擎的运用问题也是一个很复杂的问题。但本文是站在“引擎的笼统这个维度来论述问题的。对于“引擎的运用问题,可参考我的前作:2003年11月份的、2003年12月份的、2004年7月份的。 也就是说,本文不是指点大家如何去“运用jbpm,而是论述“jbpm的引擎的内核部分是如何构建的。但本文的主旨不是通知大家“jBpm是如何设计引擎内核的,而是以jBpm为例,来引见“引擎内核。4 擎内核所关注的四个主要问题引擎内核所关注的是一个非常“笼统层面的问题,而不同引擎关注的“一套完好的执行环境。或者我们可以这么来说,引擎内核的职责是非常“精简的:确保流程按照既有的定义,从一

8、个节点运转到另一个节点,并正确执行当前节点。总的来说,引擎内核主要关注四个方面的问题: 1流程定义问题:不是说如何图形化的定义流程,而是如何用一套定义对象,来诠释所定义的流程。2流程调度问题:提供什么的机制,可以确保流程可以处置复杂的“流程图构造,诸如串行、并行、分支、聚合等等,并在这复杂构造中确保流程从一个节点运转到另一个节点。3流程执行问题:当流程运转到某个节点的时候,需求一套机制来处理:能否执行此节点,并如何执行此节点的问题,并维持节点形状生命周期。4流程实例对象:需求一整套流程实例对象来描画流程实例运转的形状和结果。4.1模型与定义对象任务流引擎本身就是一种“base on model

9、的组件,流程实例的执行都是依赖于所定义的“流程定义,而任务流引擎那么是提供了这样一种环境,来维持流程实例的运转。 所以引擎内核,必需提供一套定义对象来描画“流程定义,并且这些定义对象必需反映出一种“模型。比如jBpm的定义对象,是与其所基于的Activity Diagram模型相对应的。4.2调度机制与算法 引擎内核的另一个重要功能,就是保证流程实例准确的从一个节点运转到另一个节点,而这那么需求依赖于一套调度机制。引擎的调度机制有很多种实现方法,有的甚至是与“所依赖的模型有关。但普遍来讲,很多引擎都遭到Petri Net的影响,而采用token来调度。 jBpm本身就吸纳的token这套机制,

10、当然,与Petri Net的调度机制还是有所区别。我们将在下面的章节详细引见。4.3执行机制与形状经过引擎的调度,实例运转到某个节点了,此时必需必需提供一套机制,来判别当前节点能否可执行,假设可执行,那么需求提供一套runtime envrioment来执行节点这就是引擎的执行机制。复杂的流程引擎会依赖于“流程实例形状或“活动实例形状的约束和变化来进展处置。之一切有时候我们会把一个流程引擎也叫做“形状机,很大程度上也是这个缘由。 4.4实例对象与执行环境每个一个流程实例,必需维护一套属于本人的“运转环境和数据,而这那么是实例对象的责任了。根本上实例对象会包含如下信息:1与流程实例的形状或控制信

11、息2与活动实例的形状或控制信息。假设某些引擎不支持活动实例,那么必然会有某些其他实例信息,可以当前节点的状或控制信息。3一些暂时的“执行信息,便于引擎针对某种情况进展处jbpm,“精简的开源流程引擎. 好的开源任务流引擎不多,jbpm和osworkflow算是其中两个有特征而且比较容易实践运用的。目前一些国内的中小型流程运用工程,就是在jbpm或osworkflow的根底上扩展实现。jBpm采用了Activity Diagram的模型,而osworkflow那么是FSM的模型。当然,这仅仅是jbpm3之后的事情。自从被Jboss收买之后,jbpm对早先的2.0构架进展了重组,整个构造完全本着“

12、微内核的思想进展设计。如今这里从技术角度来分析jbpm3的优点,简单罗列几个大家都容易看见的:1jbpm的模型是采用UML Activity Diagram的语义,所以便于开发人员了解流程。2jbpm提供了可扩展的Event-Action机制,来辅助活动的扩展处置。3jbpm提供了灵敏的条件表达式机制,来辅助条件解析、脚本计算的处置。4jbpm提供了可扩展的Task及分配机制,来满足复杂人工活动的处置。5借助hibernate的ORM的优势,jbpm可以很容易支持多种数据库。 当然,还有一些优点,是很多开发人员并不太留意的,比如:1jbpm的Node机制非常灵敏,开发人员可以很容易定制“业务化

13、语义的节点,并满足运转时候处置的需求。 有很多灵敏的优点,当然也少不了存在一些“局限。1很显然,只能有一个start-state。2jbpm依托Token来调度和计算,在同一个时辰中,一个ProcessInstance只允许一个Token对象只存在一个Node中分支当然用Child Token对象处置。所以本质上就不支持“multi-instance方式。3jbpm作为一款开源的任务流引擎,其更多的是关注“如何辅助他更容易的让流程运转完成,但是并不记录“流程运转的历史和轨迹。这一点能够是东西方文化的差别性所在,由于国内的流程运用,比较关注“运转轨迹。 至于其他的一些局限,比如不支持“回退、“跳

14、转等操作,这也是由于东西方文化的差别所在。西方人以为“往回流转的情况一定也是一种业务规那么所定义,那么一定可以经过分支或条件来处理,而东方那么把“回退作为一个人性化管理和处置的潜在特点。所以诸如此类的一些“特定需求,估计只能经过扩展jbpm来实现了,甚至有时候,简单的扩展是无法处理问题的正如上一节所说的那样,“引擎的笼统会影响“引擎的运用的复杂度支持。 但是,当他试图修正jbpm代码的时候,他会顾虑jbpm的LGPL协议吗?很多国内企业从来不思索这个协议问题,寒。6 JBpm流程模型与定义对象6.1 首先处理如何方式化描画一个流程的问题这里说的“定义流程并不是说jbpm3中那个基于eclips

15、e plugin的图形化建模工具。而是如何去处理“方式化的描画一个流程的问题。 方式化的描画流程并不是一个简单的问题,从上世纪七十开场,人们就在探求用各种各样多的模型来描画流程:Petri Net, FSM, EPC, Activity Diagram, 以及近来的XPDL MetaModel等等,延伸到如今的BPEL,BPMN,BPMD等等。jBpm采用了Activity Diagram的模型语义:其将用Start State、State、Action StateTask Node、End State、Fork、Join、Decision、Merge、Process State这几个“元素的

16、组合来描画任何一个流程。其中Action State是Activity Diagram中的规范语义,在jBpm为了便于大家了解和运用,jBpm采用了TaskNode这个语义。在WfMC的Workflow Reference Model中,对流程引擎的功能描画,其中就包含一项:解析流程定义。假设想满足这这功能,前提条件就必需有最根本的两个:1有一套方式化的描画言语通常为xml格式。利用这个描画言语可以描画一个流程的定义。比如WfMC所提出的XPDL这个描画言语。当然,jBpm也有本人的一套,名为jPDL,也是一个xml格式的。2有一套对象集可以反映流程的定义模型和结果,普通叫做定义对象。流程引擎

17、就需求把“xml格式的流程定义解析为一套对象,而这套对象的构造那么反映了流程的构造。我们暂且不去讨论jPDL那个方式化的xml言语,而把重心放在jBpm那套定义对象中。由于这个定义对象是属于Engine Kernel的一部分。6.2 笼统的节点Node和转移Transition 面向对象的承继性、多态性可以让我们从最笼统的部分来描画对象。那么这套定义对象也需求从最根底的“笼统说起。process的本质就是“节点和“有向弧,当然他也可以说是Node和Link,或者Node和Transition,或者Activity和Transition等等之类的。jBpm采用的是Node和Transition来

18、表示“节点和“有向弧。于是乎,在jbpm中他可以看到这样的构造关系:对于一个节点来说,从定义角度,其只关怀几个事情:1这是个什么类型的节点。这个节点能够是start state,也能够是一个task node,或者是一个fork。2这个节点的转入Transition和转出Transition。能够有的人会说,还需求关怀节点的转入转出的类型,比如And Splite或者Xor Join之类。这个并没有错,由于很多流程模型的节点元素需求思索这个,比如WfMC的XPDL模型。但是jBpm的节点是没有这样的属性的,或者说的更准确些,是Activity Diagram模型的节点没有这样的特性。活动图是采

19、用“Fork、“Join这样的节点来处理“分支问题。6.3 流程:节点与转移的组合 仅利用节点和转移的组合,就可以表达一个“过程Process。当然这个流程只能通知人们“大约的业务过程,当然不包括很复杂的信息。如以下图所示:这是一张非常规范的“活动图,假设我们用jbpm的设计器,看看这样一张“流程图:不论他如何绘画,改动不了这张图的本质:它就只需两个根本元素:节点和转移。只是有的节点是start-state,有的是task-node,有的是join,有的是end state而已。6.4 节点的类型和扩展我们可以经过定义本人的Node节点对象,来补充jbpm自定的节点对象。只需求extends

20、Node,并重写读写xml的read和write方法,重写担任执行的execute方法,在org/jbpm/graph/node/node.types.xml中配置即可,当然,他可以写的更加复杂,更加业务化的节点。 7 jBpm的过程调度机制7.1吸纳自Petri Net思想 jBpm的过程调度机制是吸纳了Petri Net的一些思想。jBpm采用Token来表示当前实例运转的位置,也利用token在流程各个点之间的转移来表示流程的推进,如以下图所示:当jbpm试图去启动一个流程的时候,首先是构造一个流程实例,并为此流程实例创建一个Root Token,并把这个Root Token放置在Sta

21、rt Node上。 以下截取部分代码实现,仅供参考。手头有jbpm3相应开发环境的朋友,可以翻开ProcessInstance和Token这两个类。注:以下一切参考代码,为了突出主题,都曾经将实践代码中的event,log等处置删除public ProcessInstance( ProcessDefinition processDefinition ) cessDefinition = processDefinition; this.rootToken = new Token(this);public Token(ProcessInstance processInstance)

22、 cessInstance = processInstance; this.node = processInstance.getProcessDefinition().getStartState();jbpm是允许在start-state执行Task的,也允许在start-state创建工人义务。不过此处我们不予讨论。7.2 Token的推进当Token曾经在Start-State节点了,我们可以开场往前推进,来促使流程实例往前运转。对于外部操作来说,触发流程实例往下运转的操作有两个:1强迫执行ProcessInstance的signal操作2执行TaskInstance的en

23、d操作。 但是,这两个操作,都是经过“当前token的signal操作来内部实现的,如以下图所示:Token的Signal操作表示:实例需求分开当前token所在的节点,转移到下一个节点上。由于Node与Node之间是“Transition这个桥梁,所以,在转移过程中,会首先把Token放入相关连的Transtion对象中,再由Transition对象把Token交给下一个节点。让我们来看看Token类中signal方法的部分代码实现,仅供参考:public void signal() /留意ExecutionContext对象 signal(node.getDefaultLeavingTra

24、nsition(), new ExecutionContext(this);void signal(Transition transition, ExecutionContext executionContext) / start calculating the next state node.leave(executionContext, transition);接下来,请留意node.leave()这个操作。这是一个很有意思的语义转换:我们是采用token的signal操作来表示往下一个节点推进,但是实践确实执行的node.leave ()操作。假设这地方让他本人来实现,代码会不会就是这样

25、子呢?无妨此处想一想。/假设代码,仅供思索void signal(Transition transition, ExecutionContext executionContext) transition.take(executionContext);前面说过,jbpm的调度机制吸纳的Petri Net的思想。在Petri Net中,并没有transition中驻留token这个语义,token只驻留在库所Place中。所以,jbpm此处的设计思绪,是于此有一定关系的。所以只是把一个ExecutionContext对象放在了transition中,而不是一个token对象。让我们来看看node对

26、象的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操作:pub

27、lic 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 tok

28、en = 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的调度机制。

29、7.3 非常简单的调度机制怎样样,是不是非常的简单? 让我们把整个过程,用一张更明晰的“思想图来展现一下:8 JBpm的过程执行机制8.1 执行机制前面我们的“过程调度机制是为了让流程可以正确的从“一个节点转移到下一个节点,而本节所要讲解的jbpm“执行机制,那么是为提供一个运转机制,来保证“节点的正确执行。首先我们需求明确如下的概念:1节点有很多中,每种节点的执行方式一定是不一样的2节点有本人的生命周期,不同的生命周期阶段,所处的形状不同。在WfMC的文档中,为活动实例归纳了几个可参考的生命周期。仅供参考,实践很多任务流引擎的节点的生命周期要比这复杂但是,jbpm并没有突出“节点生命周期这个

30、理念,仅仅只是在“Event中表达出出来。在我看来,能够的缘由有两个:1jBpm没有NodeInstance这个概念。利用Token和TaskInstance,jBpm足以耐久化足够的信息,可以让流程实例迅速定位到当前运转的形状。2jBpm的Event曾经很丰富,并且这个Event是围绕“Token的转移而设置的,并不是围绕Node的生命周期设置的。3通常我们需求在Active和Completed的生命周期内所要操作的分支与聚合,在jBpm模型中分别由Fork、Join之类的节点替代。所以jBpm过分关注Node生命周期的管理意义不是非常大。作为个人,我并不行赏jBpm这样丢弃“节点生命周期管

31、理的实现方式,更行赏OBE最早的基于XPDL模型的java任务流引擎之一的生命周期约束和管理。但是,也不得不成认,jBpm躲避了“繁琐的形状维护,反而让处置变得“简易,也更容易被大家所了解和接受,而这也正是OBE逐渐消逝的一个缘由:过于复杂和臃肿。 让我们在前面那张jBpm的“调度机制思想图上,再稍稍补充一点为了突出显示,与上图有所改动。这张图应该可以很好的诠释出,jBpm是如何执行各种节点的,这也是得益于OO的“多态与承继特性。 8.2分支处置 jBpm的执行机制非常简单,但还是需求略微补充一下有关“分支方面的处置。jBpm采用sub token的机制来处理分支方面的处置:当遇到有分支的时候

32、,会为每个分支节点创建一个child token。在聚合节点Join或Merge,那么依赖其同步或异步的聚合方式,来分别处置。比如我们参看Fork节点的执行代码为了突出重点,省略部分代码:public void execute(ExecutionContext executionContext) Token token = executionContext.getToken(); Iterator iter = transitionNames.iterator(); while (iter.hasNext() String transitionName = (String) iter.next(); forkedTokens.add(createForkedToken(token, transitionName); iter = forkedTokens.iterator(); while( iter.hasNext() ) /省略部分代码 Execu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论