版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1 配置文件(ioc)2. pvm架构2.1. environ me nt22. service2.3. comma nd and comma nd service2.4. pvm models: processdefi nition. activitybehaviour tra nsitio n. eve nt2.5. api整体架构图3. pvm model(模型)解析3.1 activitybehaviou"内部节点)32. externalactivitybehaviour(外部节点、)3.3.基木流程的实现3.4书件机制(event and eventlistener)bi
2、bliographyabstract下而主耍是介绍了本工作流组件的某础架构以及应用.1 配置文件(ioc)abstract配登文件是很关键的一步,同时configuration api可以看做是丁作流组件的一个入口 api,其他很多 重要的service,都是通过这个api生成的.在默认情况下,包里有个jbpm.cfg.xml,这个就是他的配置文件,以下是它的内容:< jbpm-c on figurati on><import resource= hjbpm.default.cfg.xmlh /><import resource= hjbpm.tx.jta.cfg
3、xmr /><import resource= hjbpm jpdl.cfg.xmi" /><import resource= mjbpm.identity.cfg.xmln /><import resource= mjbpm.jobexecutor.cfg.xmi” /></jbpm -configuration现在再继续看下jbpm.default.cfg.xml配輕文件:< process engi necon text>< repository-service />< repository-cach
4、e />< execution-service />< historyservice />< managementservice />< identityservice /><task-service />< hibernateconfiguration><cfg resource= hjbpm.hibernate.cfg.xmlm /></hiber natecon figurati on></process-e ngine-c on text>< transaction-
5、c on text>< repository-session /><db-session />< message-session /><timersession />< history-session />v mail-session>< mail-server><sessionproperties resource= "perties” /></mail server></mail-sessi on></tra nsaction-
6、c on text>这个配程文件主耍包禽了 hprocess-engine-context*和transact ion-context'的配置现在可以來看f本工作流组件的ioc实现机制.首先是context接i i,可以从这里存储,获得对彖.object get(string key);<t> t get(class<t> type);object set(string key, object value);町以从context中获取到组件,对于ioc容器來说,一般悄况下都会提供一种加载的方式,比如从xml文件进行 加载、从资源文件进行加载。该组件是通过w
7、ireparser來解析xml,然后创建并把对象存放在wirecontext. wirecontext这个类负贞存放,提取对彖,内部用一个map來存储已经创建的对象实例,可以简单得把他看成是ioc的一个实现类.从wirecontext 的javadoc,我们可以看岀,他主要是跟wiredefinition, descriptor打交道.wirecontext里面包含了一个 wiredefinition,而wiredefinition里面包含了 系列的descriptor.毎个descriptor负责创建和初始化该对彖.比如 我们可以看到 integerdescriptor, floatdesc
8、riptor, objectdescriptor 等等.我们来看t descriptor 的接口:* constructs the object.* param wirec on text li nk wirecontext) in which the object is created this is also the link wirecontext* where the object will search for other object that may be needed during the initialization phase.* (©return the con
9、 struct ed object /object construct(wirecontext wirecontext);/* called by the wirec on text to initialize the specified object./void in itialize(object object, wirec on text wirecontext);descriptor对彖的创建可以直接通过java对象的实例化,比如(new i ntegerdescriptor(.),也可以通 过xml的配置文件來实现.对以说我们更经常用xml來配置,所以就有了 binding的概念.b
10、inding类最主 要的任务就是把xml dom到java对象的转换.bindings是把binding归类了一下而已.以下是 binding 的接口.public in terface binding string getcategory();/* does this binding apply to the given element? */boolean matches(element element);/* * translates the given element into a domain model java object.* use the parse to report p
11、roblems.object parse(element element, parse parse, parser parser);如果想看实现,我们可以看f identityservicebinding, repositoryservicebinding等等这里注意,在 该组件的实现.wiredescriptorbinding是根据tagname來解析的.所以,从它的xml配置文件,到 processengine对象的构建,是这样的一个流程.jbpm .cfg .xml 一 jbpmc on figurati on parser > binding -> descriptorwi
12、rec on text或者更清楚的,我们可以看下下面这张图山</objects>丿wireparserbindingdescriptor读取bindingdescriptor<class name二卫或箱 name二 com .7>winidsfijiitipn 初护化<objects><class name=*a gla§5- name=,com .7>wirodfinitionobject cache我们不紡也看f configurationtest测试.public void testconfigurationservices()
13、 processengine processengine = new configuration().setxmlstring(” vjbpm con figurati on>” +” < process en gi necon text” +” v repositoryservice />m +< executio n-service/a* +”< management-service/>" +” </process-e nginecon text” +” v/jbpm-c on figuratio n>k) buildprocess
14、engi ne();assert not null( processengine);assert not null( processe ngin e.getexecuti on service();assert not null( processe ngine. get ma nageme ntservice();configuration 类是入口,你可以从 configuration 类中创建 processengine,而从 processengine 中获 取到 repositoryservice, executio“service, taskservice 等等.configurat
15、ion 类里有两个实现类, 一个是jbpmconfiguration,这是默认纽.件自带的configuration解析器,另外一个是 springconfiguration,这个是木工作流组件和spring的集成.在这里,我们就只看下 jbpmconfiguration的实现,在jbpmconfiguration类里,我们可以看到他是这么公调川parser來解析 xml 的.protected void parse(streamlnput streamsource) isc on figured = true;jbpmc on figuratio n parser .get inst a n
16、ce() createparse().pushobject(this) setstream sou rce( st ream source) execute()checkerrors(”jbpm configuration ” + streamsource);在这电,我们町以看到,该工作流组件的配賢文件是有两个元索组成的,一个是process-engine-context, 另夕i、.-个是transaction-context. jt1!1 process-engine-context里面的元索是包括了对外发布的服务, 比如 repository-service, execution-ser
17、vice 等等.而 transaction-context 则包括了他的内部真正实 现,比$nrepository-service应repository-session.也可以简单的把repository-servie看做是api, repository-session看做是spi.这样做的好处是,spi的实现,对api 点影响都没有,很大程度上提供 了一个容易集成的特性.2. pvm架构这里,我们看下pvm概念和架构,这也是幣个项目的核心所在pvm (process virtual machine),主要是想作为一个开发平台,在这个平台上,可以很方便的开发工作流,服务编制 (orchestr
18、ation),bpm等等.就比如说jpdl这套语法的内部实现就是雉于pvm的.将来基于pvm可以开发一个符合 ws-bpel2.0的模块.pvm可以简单的看成是一个状态机.我们接下去看下里面的几个重要概念.2.1. environm entenvironment的概念,主耍有以下的作用1. 使process能在不同的环境下z行,比如可以在标准的java,企业级java,seam或者 spring环境下运行.2. 他可以存放若不同的context对象,比如我们之前所看到的配冒文件中的process-engine的 context, transaction 的 context 等.在代码中,我们想
19、获得其他的组件时,或者变量时,我们总是使用environment的api,我们可以看下它的api的儿个重 耍方法. public abstract <t> t get(class<t> type);/* * searches an object based on type the search doesn take superclasses of the con text eleme nts* into account.* return the first object of the given type or null in case no such element
20、was found.*/public abstract <t> t get(class<t> type, string searchorder);environment内部是使用map來保存不同的context对彖,environment对象的创建主要是有 environmentfactory來负贵.environment是被保存在threadlocal中,如果有多个environment,那么是选择把 environment(s)放在-个堆栈中,然后再存放在threadlocal电.2 2 serviceservice就是pvm对外发布的服务,包括repository
21、service(比如部署jpdl文件),executionservice(负责管理执 ff),taskservice,managementservice等等.可以说这是给用户调用的api.比如我们看下他们的一些方法. repositoryservice 接口的一些方法:public in terface repositoryservice newdeployment createdeployment();processdefinitionquery createprocessdefinitionquery(); executionservice 的一些方法:public interface e
22、xecutionservice processlnstanee startprocesslnstancebyld(string processdefinitionld);processlnstanee signalexecutionbyld(string executionld);managementservice 的接i i:public in terface man ageme ntservice void executejob(long jobdbid);jobquery createjobquery();23. com m and and com m and servicecomman
23、d概念的引入,主要是想对所有的操作做一个封装对以说匕血每个service的方法的实现都是通过实现一个command來操作,然后通过commandservice调川到后面具体的实现.我们先來看卜command的接i i.public in terface comma ndvt> exte nds serializable t execute(environment environment) throws exception;很简单,很典型的command模式.我们接卜來看commandservice i i,顾名思义,他卞要是负责來执行command(s)的操作所以其他service的实现
24、 都是通过commandservice来调用到后而的实现,可以把commandservice看做一个桥梁的作用.看一下 commandservice 的接口.public in terface comma ndservice throws jbpm exception if comma nd throws an exception.<t> t execute(comma ndvt> comma nd);commandservice还有一个特性,就是可以配逍interceptor, lt如事务就是在这一 service中來配逍看下commandservice 的配置.<
25、command-servicev retry-interceptor />venv iron m ent-intercept or />< standard-transactiorrinterceptor /></command -service这里,在执行真止的 commandservicel mpl z 前,会先之;前 ret ry-1 ntercept or, environ merit-interceptor 等等这里 的interceptor的顺序是跟配置的顺序一致的.比如这样的配迸,那就是retry-interceptor在 environment-i
26、nterceptor z前执行.我们看f面这个图.defaultconmandservice町以说commandservice是最适介处理横截而(cross-cutting)的问题,比如书务,安全等的.commandservice默认 下是defaultcommandservice,11果是在使用ejb的惜况下,它的实现类就是ejblocalcommandservice和ejbremotecom mandservice类.所以,这!卩:是远程调用,还是本地调用,对用八而言,都是透明的.1. retry-interceptor 的上要作用当碰到 staleobjectexception(也就是
27、optimistic locking 失败)时,过一定的时间后再尝试.2. environment-interceptor 的.主要作川就是,保ill: command 是在 environment 范围内执行, 也就是在执彳j,command zhu,openenvironmerit,执行z后,closeenvironment.3. standard-transaction-interceptor 的主要作用就是处理事务.4. authorization-interceptor,主要是处理权限校验.2.4. pvm models: processdef in it ion, activity
28、 behaviour, tra nsition,eventprocessdefinition是一个怎义好的工作流程.openprocessdefinition里面包含了启始的activity.流程的走 向是通过activity的流向來组成的.transition就是川來连接activity而后來构成一个流程的.一个工作流的工作引擎, 最基本的两个功能:一个是设计好当前的工作流程第二个是有个东西需耍來体现当前走到流程的哪一步,那么pvm中的 execution api就是这个作用.至于最后一个event,就是你可以定义一些事件,比如当流程进入到某一个activity的时 候,促发email. e
29、vent和activity瑕人的区别在于event本身不会构成对流程走向的改变.我们先看下activitybehaviour的接口public in terface activitybehaviour exte nds serializable void execute(activityexecution execution) throws exception;就是到这个activity,需要执行的操作都在execute方法!l!还有一种activitybehaviour,就是属于wait state, 也就是会停留在这个节点上,需要外部的一些触发,才会继续执行下去,这种惜况,需耍实现的接口就
30、是 external activity behaviour.接口 如下.public interface external activity behaviour extends activitybehaviour /handles an external triggervoid signal( activityexecution execution, string signalname, map< string, ?> parameters) throws excepti on;wait state (也就是实现 externalactivity behaviour)的促发,是通过
31、 transition 来完成的,来看t transition这个接口.public interface transition extends observableelement /* * the activity from which this transition leaves */ activity getsource();/* * the activity in which this transition arrives */activity getdestination();)在pvm中,也包括了对event的支持,event的接11如f.public in terface eve
32、ntliste ner exte nds serializable void notify(eventlistenerexecution execution) throws exception;如我们之前所说的,processdefinition 是由 activity,transition 以及 event 组成的,processdefinition 是由processdefinitionbuilder的api来创建我们稍微看下这个api的使用.clien tprocessdefiniti on definiti on = processdefi nition builder, st art
33、 process(mjeffprocessh)这里,我们注意到返回的是clientprocessdefinition,那么他和processdefinition的区別在哪儿呢? client processdefinition是继7氏processdefinition.他还包括了一些负责创建和启动processinstance的方法类似 的,你会发现有 clientprocessinstance和 processinstance接i i,他们的区别也是 clientprocessl nstance 多负贵 启动的start方法.2.5. api整体架构图我们最后从胳体上來看卜这些api z间的
34、联系,这个图片很消楚的描述了他的架构思路executionmanagement匚匚厂匚j厂process servicecommand servicemtercptor inter captor interceptorenvironmentcommandsif chivemwioenevent listener apiclient apiactivity apiwve money这里需要注意的是,木身pvm内部的流程立义模型是pojo的,所以如果你只是想测试流程的止确性,你只需要氏 接使用 client 的 api,比如 clientprocessdefinition, clientproce
35、sslnstance 等的 api.不需要去调用 repositoryservice, processengineservice.这些 service 定针对你把 processdefinition 在保存在数据库的情况 下才需耍用的.3. pvm model(模型)解析这里,我们将利用pvm所提供的model,来实现一个基本的工作流引樂.3.1 . activity behaviour(内部节点)止如我们2前所说j.activitybehaviour是幣个流程的定义核心所在,我们再看下它的api.public in terface activitybehaviour exte nds ser
36、ializable void execute( activity execut io n executio n) throws exceptio n;当之行到activitybehaviour的时候,整个流程的走向完全是由他的execute()方法来决定比如你可以调用 execution.end()來结束这个流程,或者调丿ij execut ion. wait for sig nal()进入一个等待状态.我们接下去來实现一个 很简单的 activitybehaviour.public class display implements activitybehaviour string messa
37、ge;public display(string message) this.message = message;public void execute(activityexecution execution) system .o ut.pri ntln( message);如果我们在executef)方法中,没有显示的调用execution中的方法,比如waitforsignal(),take(transition)等 方法,那么默认的顺序是这样的. 1.如果当前的节点有默认的outgoing transition,那么就调用这个默认的transition.2.如果当前的节点有父节点,那么就
38、调用到父节点.3. 最后,如果都没有,那就调用execution.end()方法.我们先用这个display,来创建下而的process.figure 1 display exam pie processclientprocessdefi nit ion processdefinitio n = processdefinitio n builder .st art process(”helloworld”).startactivity(nan, new display(mhelloh).initial()transition(”b”).endactivity().startactivity(“
39、bs new display(”worlct).endactivity().endprocess();然后,调用processdefinitio n. start processlnsta nce();就会得到如f的结果helloworld我们这个display的节点就是采用的隐式execution执行方法.细心的你会发现,我们在定义process defintion的时候,总是耍在调用一个initial()方法.这是设定当前 这个节点为流程的启始节点.3.2. ex t er n al act i v it y behaviour (夕卜部节点)外部节点就是代表着,这个活动还需耍系统外部的配
40、化比如说人工的配介才能使得这个流程继续下去我 们一般称这种的节点为wait state.因为他需耍一宜等待,宜至外部活动的促发,然后流程才继续.这种 的节点需要实现 external activity behaviour 的 api public interface external activity behaviour exte nds activitybehaviour /handles an external trigger.void signal(activityexecution execution, string signalname, map< string, ?>
41、parameters) throws exception;跟内部节点类似,执行到externalactivitybehaviour的时候,也是执行它的execute()方法,但是一般來 说,在外部活动的execute()方法中,会调用execution.waitforsignal()方法,使得activity进入一个等 待状态.直到外部调用signal()方法來使得流程再次从等待状态变成激活.一般來说在signal()方法中,会 调用 execut ion.take(signalname)根据 signalname(也就是 transition n ame)去找到下一个节点,然 后把整个流程走
42、到下一个节点.很简单的一个例子是,比如说-个巾请审批的流程,员工递交一份巾请上去,然后继续就进入一个wait state的状态,因为他需要经理的审批(也就是一个人工的活动),那么经理可以选择一个ok的signalname, 使得整个流程进入到下一个节点,这电就好比如是结束的节点,又或者使得整个流程直接结束.我们接下來实现一个简单的waitstate,实现externalactivitybehaviour的接口public class waitstate implements externalactivitybehaviour public void executeactivityexecuti
43、on execution) execut ion. wait forsignal();public void signal(activityexecution execution,string signalname,map< string, object> parameters) executio n.take(sign alname);一样的,我们来看一个简单的从a-> b的流程这次不同的是卫和b都是wait state.figure 2. the external activity exam pie processprocessdefinition 的定义clientpr
44、ocessdefi nition pd = processdefi nition builder.start process(hhelloworld,v)startactivity(”a”,new waitstateo).initial().transitioncb”,hb-transitionw).endactivity().startactivity(mbmf new waitstateo).endactivity().en dprocess();启动这个 processdefinitionclien t process instance instance = pd. start proc
45、ess in sta nce(); instance.isactive(nan)在启动之后,因为执行到a的时候,是一个wait state,所以,当前的流程活动应该是指向乩如果耍到b这 个activity,那么就需耍调用in sta nee. sig nal(”b tra nsitionh);instance.isactive(,b)那么,你就会发现,经过我们调用signal方法,instance根据所提供的transitionname (b-transition),找到下一个节点,也就是b.但因为b也是一个wait state,所以此刻,整个流程就停留在了 b节点身上.3.3.基本流程的实现
46、接下來,我们基于前面两种节点的实现,來实现一个稍微比较正式的流程(loan process).submit loanfigure 3 the loan processprocessdefinition 的定义clientprocessdefinition pd = processdefinitionbuilder.startprocess(hloanprocess”).startactivity(”submit loan request*1, new display(hsubmit a loan request*).initial().transition("evaluate”,&q
47、uot;evaluate-transitiort).endactivity().start act ivity(mevaluate new waitstateo).transition "wiremoney”,"approve”).transition(”end”,"reject").endactivity()startactivityc'wiremoneym, new display(mwire the money°).tra nsition ("archive”) .endactivityo.startactivity(&
48、quot;archive,>, new waitstate().transition(”end”,”done”) .endactivity().startactivity(kendh, new waitstateo).endactivity().endprocess();启动这个 process in stance instance = pd startprocess instan ce();启动这个processinstance后,它开始点在submit loan request这个节点,后面经过display这个节点,默认走到了 evaluate这个节点.因为evaluate是个wa
49、it state,所以流程停在了 evaluate.submit loan requestexecutionevaluaterejectapprovewire moneyarchiveendfigure 4. execution positioned in the 'evaluate* activity现在呢,evaluate这个节点有两条支路,一个是approve,指向wiremoney节点;另外一个是reject,直接 走向end.假设我们选择approve这条支路.instance.signal(happrovem);走向下一个节点,archive.submit loanfigure 5 execution positioned in 'archive' activity同样的,因为archive节点是个wait state,所以需要再一次的signal,才能走到end这个节点.insta nee. signal(udonem);这样的话,整个流程就会走向了 end节
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年肠道传染病消毒隔离培训
- 2026年实验室生物安全隐患排查与奖惩管理办法
- 2026年手机充电器长期不拔引发火灾事故警示
- 2026年房地产代建项目拓展与运营管理整合
- 2026年公司职业健康监护档案管理制度
- 2025甘肃省白银市中考英语真题(原卷版)
- 2025湖北省中考物理试题(解析版)
- 2026年某公司合规管理实施细则
- 2026年深基坑开挖风险辨识与坍塌应急措施
- 2026年新时代乡风文明建设的困境与突破路径
- 船舶自动化机舱实习报告
- FZT 61001-2019 纯毛、毛混纺毛毯
- 《如何上好自习》课件
- 阿含经白话文
- 《供应链管理》期末考试复习题库(含答案)
- 4-肠结核及结核性腹膜炎
- GB/T 38362-2019进境百合种球疫情监测规程
- GB/T 22095-2008铸铁平板
- FZ/T 73023-2006抗菌针织品
- 连续退位减法教学课件
- 2022高中学业水平考试通用技术试题库(新版)
评论
0/150
提交评论