JBPM工作流引擎分析_第1页
JBPM工作流引擎分析_第2页
JBPM工作流引擎分析_第3页
JBPM工作流引擎分析_第4页
JBPM工作流引擎分析_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1、jbpm工作流引擎分析周光昭(清华大学软件学院,信息系统与工程研究所,北京10084)摘要:本文以jbpm 3.2.2为蓝本,分析了 jbpm工作流管理系统的基木体系结构,对其核 心的工作流引擎做了流程定义、流程解析、流程调度、组织模型等基本功能的分析,并修改 了源代码增加了部分在jbpm 3.2.2自带webconsole未实现的功能。关键词:jbpm工作流引擎1.引言jbpm,全称java business process management,是一个基于j2ee的轻量级柔性可扩展 工作流管理系统,最新版本为322。作为red hat旗下开放源代码软件公司jboss的企业 中间件平台的一个

2、组成部分,jbpm提供了强大的业务流程管理功能。jbpm是一个开源软 件,遵循lgpl开源协议;它以纯java编写,适用于不同的操作系统;采用自定义的 jpdl(jboss jbpm process definition language)语言描述业务流程,同时提供对bepl的支 持;数据持久层以hibernate为依托,儿乎支持目前所有的数据库管理系统;釆用面向图的 编程(graph oriented programming)思想,架起业务人员和系统分析人员间沟通的桥梁,实 现了业务流程建模到具体实现的平滑过渡。2. jbpm体系结构jbpm工作流管理系统包含3个主要组件:核心组件jbpm工

3、作流引擎,封装成java 类库,可以被方便的调用;可视化流程定义组件一一jpdl designer,是一个图形化工具, 以eclipse插件的形式存在,方便不懂编程的业务人员或业务分析师设计业务流程;应用组 件jbpm web console,以jsf为表示层,捉供流程实例与用户的任务交互界面,同时 作为流程管理和监控的控制台。下展示了组件间的依赖关系,及其和wfcm标准工作流系统体系结构的对应关系。administrationprocess definrtkxi tooljboss jbpm graphicol process designer (eclipse plugin: graphi

4、cal interface xml editor)in xml formatigraphical designer (eclipse based)1 iprocessesruntime1iiengineiiiweb consoleembeddableand monitworicflow api and interchange fonnats一 *iiiiiprocess repositoryruntime executions-qhistoryi iijboss jbpm concole web applicationidentity component (to be developed)wo

5、rkflow enactment & workflow enginejboss jbpm core componentworkflow clientjboss jbpm concole web applicationinvoked applications e g custom java softwere图2jbpm工作流管理系统体系结构作为核心的工作流引擎又可以进一步分解为以下组件:流程定义装载,负责流程定义 的语法验证和解析;流程执行服务,负责流程的实例化,以及流程实例的执行调度、资源 分配等;请求处理器,将客户端传递给流程执行服务;日志管理器,记录引擎运行的日 志信息;状态管理器

6、;交互服务,提供引擎与遗留系统的交互。下图展示了组件间的依赖关系。本文着重分析jbpm工作流引擎的核心功能:流程解析和流程调度。图2.2 jbpm流程引擎体系结构3. jbpm流程定义要对流程进行解析,首先必须定义流程。jbpm提供了可视化流程设计器方便用户进行 业务流程的定义,在流程定义中借用了的uml的状态图和活动图的思想,使流程更加直观 易懂。下图展示了 jbpm中的流程定义图和uml活动图的对比。starty «tasl< nooe» taskl<2 «fork»node» lask2y «ta$ktask3m &

7、quot;jo 仍 *图3jbpm流程定义图和uml活动图流程定义保存在一个xml文件中,主要由下面七个部分组成:1. swimlane,泳道,它们被用于任务分配,一个泳道可以被视为一个参与者在这一流程 中的角色名称。2. start-state,流程的起始状态,所有的流程实例都是从这个状态开始的,没有起始状态 的流程是合法的,但不能被执行;3. node-elements,包含一系统流程定义的节点,这些节点类型包括end-state|state|node|task-node|process-state|super-state|forkjoin|decision transition作为nod

8、e-elements的一个子元素存在4. action-elements,全局定义的动作,可以在事件和变迁中引用,为了被引用,这些动作必须被指定名称;包括 action|script|create-timer|cancel-timer5. event,事件,服务于动作的流程事件,作为action-elements的容器;6. task,任务,和用户交互;7. exception-handler,异常处理器,用户定义的流程异常处理程序。3.1 jpdl流程定义的对象及其关系从图3.1我们可以看出,jbpm流程定义中最基本的对象就是节点(node)和变迁 (transition),节点表示不同的业

9、务处理逻辑,变迁指出节点间的执行顺序。jbpm在节点和 变迁的基础上又抽象了一层,称之为图形元素(graphelement)o同时为了表达节点和变迁事 件的具体执行逻辑,引入了动作(action)的概念。图形元素有5个主耍屈性:名称(name)、 描述(description) 所属流程定义(processdefinition)、可触发事件(events)、异常处理器 (exceptionhandler)。除了前面提到的节点和变迁,还有流程沱义(processdefinition)和任务 (task)也继承了图形元素。所有在流程图上可表达的节点,如开始节点、分支节点、汇合节 点等,都继承了 n

10、ode对象。下图展示了基本对象间的继承关系。图3.2 jbpm流程某木对彖间的继承关系除了基本对象外,jpdl还定义了 action、event等辅助的元素,下图展示了一个流程定 义中对象的关系:图3.3 jbpm流程定义中对象的关系3. 2 jpdl中的主要节点类型jpdl的主要节点类型为以下8个:任务节点(task node)、自动节点(node node)>状态 节点(state node)决策节点(decision node) 分支节点(fork node)> 汇聚节点(jion node)> 开始节点(start node).结束节点(end nod)。这些节点是业

11、务流程定义中最常用的,下面分别 说明不同节点的功能: 任务节点个任务节点可以包含一个或多个任务,任务的完成需要和用 户进行交互(一般通过表单形式)。当流程执行到一个任务节点的时候,任务节点上的任务 被实例化并插入相应用户(组)的任务列表屮。然后,流程进入等待状态,直到用户完成任务。 任务的完成将触发流程实例的继续执行,即触发标记(token)。表单和任务的绑定通过 froms.xml文件实现。 自动节点©node ;自动节点包含由计算机自动完成的任务,用于显示表达业务分析 中相对重要的自动任务。一般来说,该节点包含一个名为动作(action)的子元素,其内容 是一个java类(实现a

12、ctionhandler接口),用于实现所需的api调用。对于那些不需要在 流程中显示表达的api调用,可以把动作(acition)隐含在节点的事件(event)属性内实现。(工作流引擎调用外部系统的api) 状态节点:状态节点实际上就是一个等待状态状态,与任务节点不同之处在 于它不会在任何用户的任务列表插入任务实例。状态节点用于等待外部系统的响应,例如: 当流程执行到该任务节点时,流程进入等待状态;直到外部系统发回一个响应消息时,标记 被触发,流程继续执行。(外部系统调用工作流引擎的api, 一般是触发标记) 决策节点必:决策节点即单一选择路由节点,有3种方式指定决策标准。最 简单的是使用决

13、策表达式,返回一个出向变迁名。另一种方法是给决策节点的每个出向变迁 附上一个布尔表达式,当流程执行到决策节点时,工作流引擎将按流程定义文件中的顺序依 次计算每个变迁上的布尔表达式,选择第一个为真的变迁向下执行流程。最后一种方式,也 是最灵活的方式是使用决策处理程序:一个实现decisionhandler接口的java类,该类返冋 决策结果的变迁名,例如调用规则引擎按照事先定义好的业务规则执行决策。这3种决策方 式命名为:表达式决策、变迁条件决策、接口决策。 分支节点。:fork ;分支节点即并行路由节点,把当前流程的执行路径分为多个并行 的执行路径。当流程执行到该节点时,标记(sken)停留在

14、fork节点作为父标记,同时产 生与分支数相同个数的子标记,子标记沿各白分支向下传递。 汇聚节点5-join :汇聚节点必须与上述分支节点成对使用,所有到达汇聚节点的子标 记应由同一个父标记产生。当子标记到达汇聚节点时,子标记自动结束。当最后一个子标记 到达汇聚节点时,父标记将传递到汇聚节点,并沿汇聚节点的唯一出向迁移向下传递。在这 之前汇聚节点一直处于等待状态。 开始节点o st-t : 一个流程定义只能有一个开始节点,它没有入向迁移,只有出向 迁移,作为流程的开始标记。开始节点最多只能包含一个任务。开始节点可以不进行人员选 派,默认的任务执行人为流程实例的发起者。 结束节点end :结束节

15、点表示流程的终止,它仅有入向迁移,一个流程可以有一个 以上的结束节点。3.3 jpdl中的辅助节点类型作为主要节点类型的补充,jpdl中还定义了以下4种节点: email节点jognode:在流程中显示的表达发送email给指定用户的节点,完全对 以用自动节点加上适当的参数代替它。 esb 服务节点 esb service:企业服务总线(esb, enterprise service bus)是 jboss 新推行的一个soa平台,通过服务封装企业遗留系统的应用,达到企业应用集成的目的。 esb服务节点就是用于调用esb提供的服务的,可以用白动节点加上适当的参数代替它。(注:jbpm已经被集成

16、到jbossesb系统中) 流程状态节点procem state :调用一个子流程。 超态节点super state :超态是一组节点的集合,可以用來在流程定义中产生一些层 次,例如,一个应用可能要把流程屮的所有节点按阶段进行分组。3. 4 jpdl流程定义文件的xml文档结构及其校验jbpm的流程定义保存在部署包的processdefinition.xml文件中,jpdl的xml schema 描述对该文件做了限定。一个xml schema通常是一组为了描述一类给定的xml文档而预 先定好的规则。它定义了可以在指定xml文档屮出现的各个元素以及和某个元素相关的若 干属性。jpdl的xml s

17、chema包括3个不同的版本的文件:htip:/docs.jb()/ibpm/xsd/jpdl-3.0.xsclhmd://jbdm/xsd/idd13.1 .xsd hhd:"bdm/xsd/iddl3.2.xsd可以在jbpm-jpdl.jar包的orgjbpmjpdlxml目录下找到,其中jpdl-3.0.xsd有详细的注释。 附件的schema.rar里也有图形化的说明。所以这里不在赘述。4. jbpm对流程定义的解析jbpm对流程定义的解析是直接对processdefinition.xml文件进行解析,提取

18、其中的元素 和属性,生成一套对应的对象,这套对象的结构反映了流程定义的结构。解析流程定义的类 为orgjbprnjpdlxmljpdlxm】reader.java,总体流程如下图所表示。进行流程泄义语法校验和 解析时,调用的是开源xml解析包dom4jo下面一一介绍各个部分的详细解析过程。图4jpdl流程定义解析总体流程4. 1 解析泳道(swimlane)泳道解析调用函数readswimlanes(root),英中root是经过dom4j解析后工成的doc树根, 函数声明如下:protected void readswimlanes(element processdefinitionelem

19、ent)该函数获取processdefinitionelement 'p的所有swimlane元素,按下图中的流程解析, 生成对应的对象。从下面的解析流程图中可以看出,泳道的表达式分配使用的委托程序属于 identity包,这个包是独立于引擎核心的。如果不使用identity包就无法使用表达式分配。图4.2jpdl泳道解析流程图4. 2解析动作(action)<action-types> <action-type <action-type <action-type <action-type <action-typejbpm-jpdl.jar 包

20、中的 org/jbpm/graph/action/actionlypes.xml 文件定义了 5 种默认 action 类型和对应的处理类:element = ,actionmclass=norg jbpm.graph def action11 />element = ,create-timern class = norg jbpm.scheduler.def.createtimeractionn /> element = ,r cancel-timer11 class = ,org jbpm .scheduler def. canceltimeractiion” /> el

21、ement = ,1 scriptmclass=norg jbpm. graph. action. script11 />element 二"mail”class=norg. jbpm gr?aph .action .mail act ion11 /></action-types>jbpm处理的时候使用一个map types = new hashmap()来保存action类型和对应的处理类。解析动作调用函数readactions(root, null, null),函数声明如下:public void readactions(element eventele

22、ment, graphelement graphelement, string eventtype)该函数获取eventelement中的所有元素,按下图中的流程解析。pnipw lenwni巾gmt严 电n;事松仔是 a*vme knr n muo wmrfl图4.3 jpdl动作解析流程图4. 3解析事件(event)解析事件调用函数readevents(root, processdefinition),函数声明如下:protected void readevents(element parentelement, graphelement graphelement) 该函数获取parent

23、element中的所有event元素,按下图中的流程解析。图4.4 jpdl事件解析流程图4.4解析节点(node)解析节点调用函数readnodes(root, processdefinition),函数声明如下: public void readnodes(element element, nodecollection nodecollection) 该函数获取eventelement中的所有元素,按下图中的流程解析。图4.5 jpdl节点解析流程图 下图是对节点的定时器(timer)元素的解析过程:readnodetimers(nodeelement, node);快取毎卜timer元素

24、.竦卜逬ijreadnodetimeiifttsreadnodetimer(timerelenient, node);设 wcanceltimer action 名称new canceltimeraction将canccltimcracion加入到节点的 eventtype_node 丄 eave 爭件屮图4.6节点定时器解析流程图4. 5解析异常处理器(exceptionhandler)解析界常处理器调用函数readexceptionhandlers(root, processdefinition),函数声明如下: protected void readexceptionhandlers(e

25、lement graphelementelement, graphelementgraphelement)该函数获取grapheiementelement屮的所有exception-handler元素,按下图屮的流程解 析。read extepliofl i biiclkr4n<mk 嵐 iema vwmflek/卿折h常处理类对梅个euepthiuiaiidkr7t*做如下处理read exccplkm hximxr(卍“艸山皿 handhre kinvfiugnipyiek incihk图4.7异常处理器解析流程图4. 6解析任务(task)解析任务调用函数readtasks(roo

26、t, null),函数声明如下:public void readtasks(element element, tasknode tasknode)该函数获取element中的所有task元素,按下图屮的流程解析。该解析函数是流程解析 中最复杂也是最重要的函数,不仅在流程根节点的任务解析中用到,更主要是的在tasknoe 节点的解析屮使用。图4.8 jpdl任务解析流程图readtasktimers(taskelement, task);/处理枉务的所有定时霽获取隹务元素下的騎有timei和remindei子元素枫f?readtasktinier(element, task)機作图 4.9 re

27、adtasktimers 流程图滾电任衿试的iiwtmlmr.witlw<m(jnrnrnl rtaiu任券桝览有无<adilwarain fcadi rvmcd«, vnknou-n 5* frliim1 iwindbhknhnr w *1" +bnhhamc沁iu :inin0 a<a3ming:mi vh imlmc nrimipnm specified for iaok" f culmmr)readawigiunrdtdtkgatiunfelenieni si初餾mruw tekme刚emi业住毎分ie贡托現序e卜空的內e更取丿 i li

28、/i.prr- -imh ijk 石尸xilcdhxlumjs d 卜itfe希程乩肿if敝为贩射怔拎耀托为wvwp«yhmip<i忙呼 ttti 5<inas» ignnertt ha nd e r 夷否屮如盘譽豐ui 花吋“au*l*£ixa±a iqrwaz'ihandlet址assign mcntljckjui lionjeatujissis'ftmen lekmeiiu th kk"读取自室任寡分ie委托程序 | |1|(订:汕m.二亟in”、为咤?th l :iakh* 甲的lesiuadklu :ini

29、n 'hi» ciimjwdrkt in + hunnmcx图4.10 task任务分配解析流程图图4.11 task任务通知解析流程图ciincmllcrread!askcon troller(takc on i roller £km«n i)力解析任务控制器图4.12 task任务变量解析流程图4.7 解析变迁(transition)解析任务调用函数resolvetransitiondestinations(),该函数对节点解析过程屮最后一步生 成的未解析变迁列表进行操作。列表屮的元素以object nodeelement, node的形式成对出 现,

30、每对占list中的一个位置。解析吋逐对取出未解析的变迁,调用 resolvetransitiondestinations(nodeelement.elements("transitionu),node),该函数再对每个变迁 元素调用 resolvetransitiondestination(transitionelement, node)函数进行解析。下面的流程图显 示 resolvetransitiondestination 的流程。否获取变迁的9属性是9属性为空?addwarning(unode 山十 nodename + m, has a transition * withou

31、t a 'toattribute to specify its destinationnodem);否resolvetransitiondestination(transitionelement9 node);/解析节点曼迂元家设置变迁条件为设置变迁条件conditon/cxprcssion 性为 conditon1 1丁否将变迁加入到节点的出i变迁列表中图4.13 jpdl变迁解析流程图4. 8 匹配引用动隹(act i onreferences)引用动作的匹配是对acion解析过程中未做处理的的ref-name类型的动作进行匹配,未 处理引用动作列表以成对的new objectf

32、actionelement, action 形式保存在一个list屮。匹 配函数为resolveactionreferences(),对于列表中的每个对,做下面流程中的处理:对lutrewhedac 血中adioi 元 jtftk 下血的处理hcikxija.-tkn图4.14 jpdl pt配引用动作流程图4. 9 泳道人员选派验证(ver i fyswi m i aneass i gnments)泳道人员选派验证是对任务管理定义中的泳道逐个检查其是否能够在流程实例运行时 执行人员选派操作。对任务管理宦义中的放道瑕个嵌如卞録d4fl 11. af: ft j:乂 m的幵站it点k4x. ji

33、 si pxz hkkan.ddhinin© ,亦血旳皿严* swimlincnamv苜成的他吐人楓* docs nw hav« m a»初lnwncil裁剖£程庁为图4.15 jpdl泳道人员选派验证流程图5. jbpm流程实例调度机制分析5.1流程实例推进机制jbpm的流程实例调度借鉴了 petri网的思想,采用与token类似的execution标示使能 节点,用execution的转移表示流程的推进。为了统一思想,我们还是用token这个词。流程启动时,jbpm根据流程定义实例化一个流程,并在流程实例的开始节点放置一个 根tokeno流程实例的推

34、进有两种方式:一是强制执行流程实例的signal操作,二是执行任 务实例的end操作。这两个操作实际上都是通过当前token的signal操作来实现的,如下图 所示:processinstance.signal()token signal()> tasklnstance.end()图5.1流程实例的推进方式token的signal操作表示:实例需要离开当前token所在的节点,转移到下一个节点。因为节点i'可是通过变迁连接的,在转移过程中会把token放入相应的变迁中,由变迁把token传递给下一个节点ojbpm还提供了一个执行上下文对象(executioncontext)来维护

35、当前token确定移交的executioncontext对象-token.sig nal()i1确疋转向 的tanstiort运行环境信息,可以把executioncontext看做一个token,因为其主要对象就是token signal 操作实际调用的是token所在节点的leave操作,leave操作的的参数为当前执行上下文和出 向变迁。出向变迁通过执彳亍上下文获取token,并将token传递到出向变迁指向的节点。最 后执行所在节点的下图展示了 token传递的流程。离开芳询节点node.leave() 蟲噩鶯寫烫咅transition搖受executioncontext ig把 ex

36、ecutioncotext 对彖 枚交给f -个nodetoken绑定 '勺询节点执行布点 node.execute()图5.2 token传递的流程简单的看,流程实例的推进就是按顺序执行以下函数:token.signal(transition)node.leave(executioncontext,transition)t transition.take(executioncontext) -> node.enter(executioncontext)node.execute(executioncontext)将 token 封装到 executioncontext 屮 /ex

37、ecutioncontext离开当前节点 /executioncontext 传递到变迁 /executioncontext 到达下一节点执行下一节点对于并行流程,当流转到并行分支(fork)节点时,token停留在fork节点,作为父token同吋,按分支数生成对应个数的子token, / token仍按照上述规则推进。token的父了结构 形成了一个token树。当子token到达汇聚(join)节点时,子token结朿并等待其他子token 的到达。当所有子token都到达汇聚节点后,父token直接跳转到汇聚节点,并继续推进。实际上jbpm把petri网的库所和变迁合并表示到了一个jb

38、pm节点,下图展示了 jbpm 流程定义图和petri网间的对照。ostartexecutiontaskltask2y «tasf<task?tokenmitrti心11iii()1iyi1y1ii11 -1r1y!11111 1111 1l_j1r-rktask4ika !1ii<uy iith-!鼻endcdil图5.3. jbpm流程定义图和petri网对照5. 2资源分配机制jbpm采用taskmgmtdefinition扩展过程定义,该对象包含了流程定义中的泳道和任务 的列表,实现了任务管理的定义。在流程实例生成processinstance对象的同时,也生成一

39、个 taskmgmtlnstance对彖,该对象包含流程实例的泳道实例映射表和任务实例集合。当token转移到一个task node吋,执行该task node的execute方法,该方法调用 taskmgntlnstance的createtasklnstance方法,该丿了法实例化task node下的任务对象,接着 调用taskinstance的assign方法。assign根据输入参数,调用不同的分配委托解析输入的参 数,设置 taskinstance 的 actor 或 pooled ac torso5. 3 jbpm 的 event-act i on 机制jbpm中大量釆用了事件一动

40、作(event-action)机制,例如:token的signal操作就依 次尝试触发(fire)以下事件: eventtype_before_signal eventtype_node_leave eventtype_superstate_leave eventtype_trans1tion eventtype_superstate_enter eventtype_node_enter eventtype_after_signal事件和动作间是一对多的关系,事件表示触发某个或某些动作的条件,动作是一段java 代码。jbpm在流程解析时,将事件和动作进行关联,再绑定到特点的图形元素(流程定义

41、、 节点、变迁等)上。在流程运行的不同时期、不同位置,触发特定的事件执行关联的动作。 jbpm提供这些动作的底层接口,而开发者可以根据这个接口,来实现具体的执行体。org.jbpm.graph.def包里的event.java类定义了 jbpm支持的16个事件类型,如下所示。 如果用户要自定义事件类型,则必须修改jbpm的原代码,添加相应的处理。public public public public public public public public public public public public publicstatic static static static static s

42、tatic static static static static static static staticfinal final final final final final final final final final final final finalstringstringstringstringstringstringstringstringstringstringstringstringstringeventtypetransition = ,ftransitionn ; eventtype=before=stgnal = ,fbef ore-signal,r; eventty

43、pe=after=signal = maf ter-signal,f;eventtype=process=start = ,fprocess-start,r; eventtype=process=end = ,fprocess-end'f; eventtype=node=enter = ,f node-enter h; eventtypenodeleave = ,f node-leaven ; eventtype=superstate=enter = usuperstate-enter,r; eventtype=superstate=leave = usuperstate-leave,

44、r; eventtype=subprocess=created = ,f subprocess-createdm ; eventtype=subprocess=end = ,subprocess-endm; eventtype=task=create = ,f task-create'1;eventtype=task=asstgn = ,f task-assign'1;public static final string eventtype=task=start = task-start'1; public static final string eventtype=t

45、ask=end = 'task-end'1; public static final string eventtypejtimer = htimern;6. jbpm工作流模式支持6.1过程模式支持在43种工作流过程模式中,jbpm完全支持的有13种,下面举例介绍这些支持的模式:1、sequence模式:使用一个变迁连接两个单独的任务节点就形成了顺序模式。下图展 示了 “客户输入订单后,开始审核订单”的sequence模式。«task node»输入订单y «task node»审核订单图 6.1 sequence 模式2、paralle

46、l split模式:jbpm中有两种表达parallel split模式的方法,一是显示表达: 用fork节点进行过程分支,每个分支可以有一个或多个任务;二是隐式表达:用一个包含 多个任务的任务节点表达,适用与每个分支只有一个任务情况。下图展示了 “客户付款后, 开发票和打包的活动可以并行执行”的并行模式。打包y «tas« noae»开发票st) task node图 6.2 parallel split 模式3. synchronization模式:jbpm屮有两种表达synchronization模式的方法,一是显 示表达:用join节点进行分支过程同步,每

47、个分支可以有一个或多个任务;二是隐式表达: 用一个包含多个任务的任务节点表达,适用与每个分支只有一个任务情况。下图展示了“开 发票和打包货后,才能送货”的synchronization模式。y <<task node»开发票y «tast< node»打包图 6.3 synchronization 模式4、exclusive choice模式:jbpm屮可以通过使用decision node由程序根据过程变量自动判断选择分支。下图展示了 “根据客户选择的送货方式,自动选择快递或平邮方式送货”的 exclusive choice 模式。y 

48、1;ta6f< node»勻通知快谨取货y «task node» 送货到邮局图 6.4 exclusive choice 模式5> simple merge模式:jbpm中可以通过使用有多个入向变迁的task node表示汇聚。 下图展示了 “快递或平邮发货后,才能进行客户确认收货”的simple merge模式。y «task node»y «task node»醸il知快递取货雜送货到邮局y «tasf< node»确认收货图 6.5 simple merge 模式6、multi-

49、merge模式:当有多个控制流到达一个task node时,jbpm可以自动实现multi-merge模式。下图展示了 “每个配件送达后都要签收”的multi-merge模式。«node» 通知电谊代理送货图 6.6 multi-merge 模式«node»11知内存代理送货7、arbitrary cycles模式:通过反向变迁可以实现。下图展示了 “重复修改,直到订单 合格”的 arbitrary cycles 模式。y «task node»尖交订单信息不全y «task node»司审核订单tzz0通过y &

50、#171;task node»修改订单vf «task node»发货图 6.7 arbitraiy cycles 模式8 implicit termination模式:没有节点可执行时,jbpm的流程实例自动停止执行。 下图展示了 jbpm对该模式的支持。y «tasf< node»签收货物«tasl< node»评价y «ta3k node»确认收款心 «for/<»是«decision»希要采购新配件?y «tasl< nod

51、e»三还原操作系编图 6.8 implicit termiantion 模式9、multiple instances without synchronization 模式:通过 fork 节点和循环可以实现。 下图展示 了 “需要采购新配件”的 multiple instances without synchronization 模式。logged inactionspruiessesfirst pruv - page 1 of 3 nexq ldslprocess id process nameversion actions4# 20 inputordorholiday-reque

52、stholiday requestdelete jstart e:,smine l elete i s*artmanaaerrunninqfeb 28, 2008 6:49:37 amexomme isusperd图 6.9 multiple instances without synchronization 模式10、deferred choice模式:通过有多个出向变迁的task node,让用户选择流程实例要 走哪个分支实现。下图展示了 “根据客户选择的送货方式,手动选择快递或平邮方式送货” 的 deferred choice 模式。口 «tast< node»

53、国选择送货方式7 «task node»i删选择送货方式|快递/平邮«tast< node»y «task node»il知快透取货®送货到邮局图 6.10 deferred choice 模式11、cancel activity模式:通过在控制台强行删除流程定义或在任务列表中强制结束任 务可以实现该模式。下图展示了这两个界面的内容。806o/jhj«-c«»isol*/svtftxki jsfyo " : httpji£r'orkflmr f孔.卜mrkflt

54、v ht< jlxs jbpm a图 6.11 cancel activity 模式12. transient trigger模式:使用jbpm的state node可以支持该模式。下图展示了 “等待银行支付系统返回支付成功信息”的transient trigger模式。«task node*付款严。«state»等待付款成功«node»逋知发货图 62 cancel activity 模式13> generalised and-join模式:jbpm的join node提供了该模式的语义。下图展示 了 “付款,开发票且打包后才能发

55、货”的generalised and-join模式。打包y «task noae»开发票图 6.13 generalised and-join 模式对于其他30种过程模式,jbpm无法完全支持,但是可以通过在节点增加辅助代码來 完全实现或部分实现,有待进一步研究。6. 2数据模式支持流程变量,即用户自定义和输入的业务数据。jbpm支持byte、string> double、long、 date这5种基本数据类型,足以满足大多数应用,还支持用户自定义的long和string类型数 据。jbpm可以在流程定义屮直接定义流程变量(controller),也可以在任务实例执行

56、过程屮 根据任务表单或用户代码动态生成流程变量。变量绑定到token,根token ±的绑定的变量 视为流程实例全局变量。每个流程实例有一个对应的contextinstance,用于维护该流程实例 中的所有流程变量。contextinstance维护两个映射表,一个是tokenvariablem叩s,用于维护 变量和token的映射表的映射表;一个是transient variables,用于临时变量名和数据的映射 表。根token绑定的变暈作为流程全局变暈。每个变暈实例对应一个variableinstance对象, 每个对彖对应jbpm_variableinstance表屮的一条记

57、录。这样给系统带来了很大的灵 活性,用户可以动态的插入和删除流程变量。但是也给流程实例的数据统计帯来了一定的困 难。jbpm完全支持的数据模式有5种,部分支持的数据模式有6种,下表对这些模式的支 持情况进行了总结。模式支持说明task data部分由于jbpm的流程变量和任务变量之间是一一对应的关系, 从这个角度上不支持该模式;但是,节点允许执行java代 码,代码屮又可以使用局部变量。case data完全jbpm支持的典型数据模式,所有变量都是全局可访问的。enviroment data部分jbpm不直接支持外部环境中的数据,但是用户可以通过编 写java代码來访问外部资源或服务來访问外部数据。task to task完全jbpm通过全局变量实现任务间的

温馨提示

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

评论

0/150

提交评论