欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    jBPM实例开发5842.docx

    • 资源ID:62743381       资源大小:422.95KB        全文页数:178页
    • 资源格式: DOCX        下载积分:40金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要40金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    jBPM实例开发5842.docx

    jBPM实例开发1.概述本处主要将向你你展示如何用用jpdl创创建基本的流流程以及如何何使用APII管理运行期期的执行。本处的形式是解解释一组示例例,每个示例例集中于一个个特殊的主题题,并且包含含大量的注释释,这些例子子也可以在jjBPM下载载包的目录ssrc/jaava.exxamplees中找到。最好的学习方法法就是建立一一个工程,并并且通过在给给定例子上做做不同的变化化进行实验。对eclipsse用户来说说可以如下方方式开始:下下载jbpmm-3.0-verssion.zip并且且解压到自己己的系统,然然后执行菜单单“Filee”->“IImportt”->>“Exissting Projeect innto Woorkspaace”,然然后点击“NNext”,浏浏览找到jBBPM根目录录,点击“FFinishh”。现在,在在你的工作区区中就有了一一个jbpmm.3工程,你你可以在srrc/javva.exaampless/下找到到本指南中的的例子,当你你打开这些例例子时,你可可以使用菜单单“Run”->“Ruun As”->“JJUnit Test”运运行它们。jBPM包含一一个用来创作作例子中展示示的XML的的图形化设计计器工具,你你可以在“22.1 下载载概述”中找找到这个工具具的下载说明明,但是完成成本指南不需需要图形化设设计器工具。1.1 Helllo Woorld 示示例一个流程定义就就是一个有向向图,它由节节点和转换组组成。Helllo woorld流程程有三个节点点,下面来看看一下它们是是怎样组装在在一起的,我我们以一个简简单的流程作作为开始,不不用使用设计计器工具,下下图展示了hhello worldd流程的图形形化表示:图 3.1 hhello worldd流程图public void testHHelloWWorldPProcesss()  / 这个方方法展示了一一个流程定义义以及流程定定义的执行。 / 这个流流程定义有33个节点:一一个没有命名名的开始状态态, / 一个状状态“s”,和和一个名称为为“end”的的结束状态。 / 下面这这行是解析一一段xml文文本到ProocessDDefiniition对对象(流程定定义)。 / ProocessDDefiniition把把一个流程的的规格化描述述表现为jaava对象。 ProcesssDefiinitioon proocessDDefiniition = ProocessDDefiniition.parseeXmlSttring(    "<pprocesss-deffinitiion>" +    " <<startt-statte>" +    "     <trransittion tto='s'' />" +    " <</starrt-staate>" +    " <<statee namee='s'>>" +    "     <trransittion tto='ennd' />>" +    " <</statte>" +    " <<end-sstate name='end'' />" +    "</proceess-deefinittion>"" );  / 下面这这行是创建一一个流程定义义的执行。创创建后,流程程执行有一个个 / 主执行行路径(根根令牌),它它定位在开始始状态。 ProcesssInsttance proceessInsstancee =       nnew PrrocesssInstaance(pprocesssDefiinitioon);  / 创建后后,流程执行行有一个主执执行路径(根令牌)。 Token tokenn = prrocesssInstaance.ggetRoootTokeen();  / 创建后后,主执行路路径被定位在在流程定义的的开始状态。 asserttSame(proceessDeffinitiion.geetStarrtStatte(), tokenn.getNNode();  / 让我们们开始流程执执行,通过它它的默认转换换离开开始状状态。 token.signaal(); / siggnal方法法将会把流程程阻塞在一个个等待状态。  / 流程执执行进入第一一个等待状态态“s”,因因此主执行路路径现在定位位 / 在状态态“s”。   asserttSame(proceessDeffinitiion.geetNodee("s"), tokken.geetNodee();  / 让我们们发送另外一一个信号,这这将通过使用用状态“s”的的默认转换  / 离开状状态“s”,恢恢复流程执行行。 token.signaal(); / 现在ssignall方法将返回回,因为流程程示例已经到到达结束状态态。  asserttSame(proceessDeffinitiion.geetNodee("endd"), ttoken.getNoode(); 1.2 数据库库示例jBPM的特性性之一就是在在流程等待状状态时,拥有有把流程的执执行持久化到到数据库中的的能力。下面面的例子将向向你展示怎样样存储一个流流程实例到数数据库,例子子中还会出现现上下文。分分开的方法被被用来创建不不同的用户代代码,例如,一一段代码在wweb应用中中启动一个流流程并且持久久化执行到数数据库,稍后后,由一个消消息驱动beean从数据据库中加载流流程实例并且且恢复它的执执行。有关jBPM持持久化的更多多信息可以在在“第7章 持久化”找找到。public classs HellloWorlldDbTeest exxtendss TesttCase   staticc JbpmmConfiigurattion jjbpmCoonfiguuratioon = nnull;   staticc     / 在“srcc/conffig.fiiles”可可以找到象下下面这样的一一个示例配置置文件。     / 典型情况下下,配置信息息在资源文件件“jbpmm.cfg.xml”中中,但是在这这里     / 我们通过XXML字符串串传入配置信信息。         / 首先我们创创建一个静态态的JbpmmConfiigurattion。一一个JbpmmConfiigurattion    / 可以被系统统中所有线程程所使用,这这也是为什么么我们可以把把它安全的设设置     / 为静态的原原因。     jbppmConffiguraation = JbppmConffiguraation.parseeXmlSttring(      ""<jbpmm-conffiguraation>>" +            /jbpmm-conttext机制制分离了jbbpm核心引引擎和来自于于外部环境的的服务。             "" <jbppm-conntext>>" +      ""    <<serviice naame='ppersisstencee' " +      ""               faactoryy='orgg.jbpmm.perssistennce.dbb.DbPeersisttenceSServicceFacttory' />" +       "" </jbbpm-coontextt>" +            / 同样,jjbpm使用用的所有资源源文件在jbbpm.cffg.xmll中被提供。            "" <strring nname=''resouurce.hhibernnate.ccfg.xmml' " +      ""           valuee='hibbernatte.cfgg.xml'' />" +      "" <strring nname=''resouurce.bbusineess.caalendaar' " +      ""           valuee='orgg/jbpmm/caleendar/jbpm.businness.ccalenddar.prropertties' />" +      "" <strring nname=''resouurce.ddefaullt.moddules'' " +      ""           valuee='orgg/jbpmm/grapph/deff/jbpmm.defaault.mmodulees.proopertiies' />" +      "" <strring nname=''resouurce.cconverrter' " +      ""           valuee='orgg/jbpmm/db/hhibernnate/jjbpm.cconverrter.pproperrties'' />" +      "" <strring nname=''resouurce.aactionn.typees' " +      ""           valuee='orgg/jbpmm/grapph/acttion/aactionn.typees.xmll' />"" +      "" <strring nname=''resouurce.nnode.ttypes'' " +      ""           valuee='orgg/jbpmm/grapph/nodde/nodde.typpes.xmml' />>" +      "" <strring nname=''resouurce.vvarmappping'' " +      ""           valuee='orgg/jbpmm/conttext/eexe/jbbpm.vaarmappping.xxml' />" +      ""</jbppm-connfigurrationn>"    );   publicc voidd setUUp()     jbppmConffiguraation.creatteScheema();   publicc voidd tearrDown()     jbppmConffiguraation.dropSSchemaa();   publicc voidd testtSimpllePerssistennce()     / 在下面调用用的3个方法法之间,所有有的数据通过过数据库被传传递。     / 在这个测试试中,这3个个方法被依次次执行,因为为我们想要测测试一个    / 完整的流程程情景。但是是实际上,这这些方法表示示了对服务器器的不同    / 请求。         / 因为我们以以一个干净的的空数据库开开始,所以我我们首先必须须部署流程。     / 事实上,这这只需要由流流程开发者做做一次。    depployPrrocesssDefinnitionn();     / 假设在一个个web应用用中当用户提提交一个表单单时我们起动动一个流程    / 实例(流流程执行)    proocessIInstannceIsCCreateedWhennUserSSubmittsWebaappForrm();     / 然后,一个个异步消息到到达时继续执执行。    theeProceessInsstanceeContiinuesWWhenAnnAsynccMessaageIsRReceivved();   publicc voidd deplloyProocessDDefiniition()     / 这个测试展展示了一个流流程定义以及及流程定义的的执行。  / 这个个流程定义有有3个节点:一个没有命命名的开始状状态, / 一个状状态“s”,和和一个名称为为“end”的的结束状态。    ProocessDDefiniition proceessDeffinitiion = ProceessDeffinitiion.paarseXmmlStriing(      ""<proccess-ddefiniition name='helllo worrld'>"" +      "" <staart-sttate nname=''startt'>" +      ""    <<transsitionn to=''s' />>" +      "" </sttart-sstate>>" +      "" <staate naame='ss'>" +      ""    <<transsitionn to=''end' />" +      "" </sttate>"" +      "" <endd-statte namme='ennd' />>" +      ""</proocess-definnitionn>"    );     / 查找在上面面所配置的ppojo持久久化上下文创创建器。    JbppmConttext jjbpmCoontextt = jbbpmConnfigurrationn.creaateJbppmConttext();    tryy       / 部署流流程定义到数数据库中。      jjbpmCoontextt.deplloyProocessDDefiniition(proceessDeffinitiion);     ffinallly       / 关闭ppojo持久久化上下文。这这包含激发(fflush)SSQL语句把把流程      / 定义插插入到数据库库。      jjbpmCoontextt.closse();       publicc voidd proccessInnstancceIsCrreateddWhenUUserSuubmitssWebapppFormm()     / 本方法中的的代码可以被被放在strruts的aactionng中,或JJSF管理     /的的bean中中。     /查查找在上面所所配置的poojo持久化化上下文创建建器。    JbppmConttext jjbpmCoontextt = jbbpmConnfigurrationn.creaateJbppmConttext();    tryy        GGraphSSessioon graaphSesssion = jbppmConttext.ggetGraaphSesssion();            PProcesssDefiinitioon proocessDDefiniition =            grraphSeessionn.finddLatesstProccessDeefinittion(""helloo worlld");          / 使用从从数据库中获获取的流程定定义可以创建建一个流程定定义的执行       / 就象在在helloo worlld例子中那那样(该例没没有持久化)。      PProcesssInsttance proceessInsstancee =            neew ProocessIInstannce(prrocesssDefinnitionn);            TToken tokenn = prrocesssInstaance.ggetRoootTokeen();       aasserttEqualls("sttart", tokeen.gettNode().gettName();      / 让我们们起动流程执执行      ttoken.signaal();      / 现在流流程在状态 's'。      aasserttEqualls("s"", tokken.geetNodee().geetNamee();            / 现在流流程实例prrocesssInstaance被存存储到数据库库,      / 因此流流程执行的当当前状态也被被存储到数据据库。      jjbpmCoontextt.savee(proccessInnstancce);      / 以后我我们可以从数数据库再取回回流程实例,并并且通过提供供另外一个       / 信号来来恢复流程执执行。     ffinallly       / 关闭ppojo持久久化上下文。      jjbpmCoontextt.closse();       publicc voidd thePProcesssInsttanceCContinnuesWhhenAnAAsyncMMessaggeIsReeceiveed() / 本方法中中的代码可以以作为消息驱驱动beann的内容。     / 查找在上面面所配置的ppojo持久久化上下文创创建器。    JbppmConttext jjbpmCoontextt = jbbpmConnfigurrationn.creaateJbppmConttext();    tryy        GGraphSSessioon graaphSesssion = jbppmConttext.ggetGraaphSesssion();      / 首先,我我们需要从数数据库中取回回流程实例。      / 有几个个可选方法来来分辨出我们们在这里所要要处理的流程程实例。       / 在这个个简单的测试试中,最容易易的方式是查查找整个流程程实例列表,       / 这里它它应该只会给给我们一个结结果。        / 首先,让让我们查找流流程定义。            PProcesssDefiinitioon proocessDDefiniition =            grraphSeessionn.finddLatesstProccessDeefinittion(""helloo worlld");       / 现在我我们搜索这个个流程定义的的所有流程实实例。      LList pprocesssInsttancess =            grraphSeessionn.finddProceessInsstancees(proocessDDefiniition.getIdd();            / 因为我我们知道在这这个单元测试试中只有一个个执行。      / 在实际际情况中, 可以从所到到达的信息内内容中提取pprocesssInsttanceIId       / 或者由由用户来做选选择。      PProcesssInsttance proceessInsstancee =            (PProcesssInsttance) proccessInnstancces.geet(0);            / 现在我我们可以继续续执行。注意意:proccessInnstancce 将委托托信号       / 到主执执行路径(根令牌)。      pprocesssInsttance.signaal();       / 在这个个信号之后,我我们知道流程程执行应该到到达了结束状状态。      aasserttTrue(proceessInsstancee.hasEEnded();            / 现在我我们可以更新新数据库中的的执行状态。      jjbpmCoontextt.savee(proccessInnstancce);     ffinallly       / 关闭ppojo持久久化上下文。      jjbpmCoontextt.closse();      1.3 上下文文示例:流程程变量流程变量包含了了流程执行期期间的上下文文信息,流程程变量与一个个java.util.Map相似似,它影射变变量名称和值值,值是jaava对象,流流程变量作为为流程实例的的一部分被持持久化。为了了让事情简单单,在这里的的例子中我们们只是展示使使用变量的AAPI,而没没有持久化。有关变量的更多多信息可以在在“第10章章 上下文”中中找到。/ 这个例子子仍然从heello wworld流流程开始,甚甚至没有修改改。ProcesssDefinnitionn proccessDeefinittion = ProccessDeefinittion.pparseXXmlStrring( "<proccess-ddefiniition>>" + " <staart-sttate>"" + "    <<transsitionn to=''s' />>" + " </sttart-sstate>>" + " <staate naame='ss'>" + "    <<transsitionn to=''end' />" + " </sttate>"" + " <endd-statte namme='ennd' />>" + "</proocess-definnitionn>"); ProcesssInstaance pprocesssInsttance = new PrrocesssInstaance(pprocesssDefiinitioon); / 从流程实实例获取上下下文实例,用用来使用流程程变量。ContexttInstaance ccontexxtInsttance =  processsInsttance.getCoontexttInstaance(); / 在流程离离开开始状态态之前,我们们要在流程实实例的上下文文中/ 设置一些些流程变量。contexttInstaance.ssetVarriablee("amoount", new Integger(5000);contexttInstaance.ssetVarriablee("reaason", "i mmet myy deaddline""); / 从现在开开始,这些流流程变量与流流程实例相关关联。现在展展示由用户代代码通过 / API访访问流程变量量,另外,这这些代码也可可以存在于动动作或节点的的实现中。 / 流程变量量被作为流程程实例的一部部分也被存储储到数据库中中。processsInstaance.ssignall(); / 通过coontexttInstaance访问问流程变量。 assertEEqualss(new Integger(5000),                conttextInnstancce.gettVariaable(""amounnt");assertEEqualss("i mmet myy deaddline"",                conttextInnstancce.gettVariaable(""reasoon"); 1.4 任务分分配示例下一个例子我们们将向你展示示怎样分配一一个任务到用用户。因为jjBPM工作作流引擎与组组织模型是独独立的,所以以任何一种用用来计算参与与者的表达式式语言都是有有限制的,因因此,你不得得不指定一个个AssiggnmenttHandller实现,用用来包含任务务参与者的计计算。public void testTTaskAsssignmment()  / 下面的的流程基于hhello worldd 流程。状状态节点被一一个taskk-nodee节点 / 所替换换。taskk-nodee JPDLL中的一类节节点,它表示示一个等待状状态并且产生生 / 将要完完成的任务,这这些任务在流流程继续之前前被执行。  ProcesssDefiinitioon proocessDDefiniition = ProocessDDefiniition.parseeXmlSttring(    "<pprocesss-deffinitiion naame='tthe baaby prrocesss'>" +    " <<startt-statte>" +   "     <traansitiion naame='bbaby ccries'' to=''t' />>" +    " <</starrt-staate>" +    " <<task-node name='t'>"" +    "     <taask naame='cchangee napppy'>" +    "       <<assiggnmentt classs='orrg.jbppm.tuttoriall.taskkmgmt.NappyyAssiggnmenttHandller' />" +    "     </ttask>"" +    "     <trransittion tto='ennd' />>" +    " <</taskk-nodee>" +    " <<end-sstate name='end'' />" +    "</proceess-deefinittion>"" );  / 创建一一个流程定义义的执行。 ProcesssInsttance proceessInsstancee =       nnew PrrocesssInstaance(pprocesssDefiinitioon); Token tokenn = prrocesssInstaance.ggetRoootTokeen();  / 让我们们起动流程执执行,通过默默认转换离开开开始状态 token.signaal(); / siggnal方法法将会把流程程阻塞在一个个等待状态, / 在这里里,就是阻塞塞在taskk-nodee。 asserttSame(proceessDeffinitiion.geetNodee("t"), tokken.geetNodee();  / 当执行行到达tassk-nodde,一个''changge napppy'任务务被创建,并并且 / NapppyAsssignmeentHanndler 被调用,来来决定任务将将要分配给谁谁。 / NapppyAsssignmeentHanndler 返回'paapa'。  / 在一个个实际环境中中,将使用oorg.jbbpm.dbb.TaskkMgmtSSessioon中的方法法 / 从数据据库获取任务务。因为我们们不想在这个个例子中包含含复杂的持久久化, / 所以我我们仅使用这这个流程实例例的第一个任任务实例(我我们知道,在在这个  / 测试情情景,只有一一个任务)。  TaskInnstancce tasskInsttance = (TaaskInsstancee)       pprocesssInsttance         .gettTaskMMgmtInnstancce()         .gettTaskIInstannces()         .iteeratorr().neext();  / 现在我我们检查taaskInsstancee 是否真正正的分配给了了'papaa'。 asserttEqualls("paapa", taskIInstannce.geetActoorId() );  / 现在我我们假设'ppapa'已已经完成了他他的职责,并并且标示任务务为已完成。 taskInnstancce.endd(); / 因为这这是要做的最最后一个任务务(也是唯一一一个),所所以任务的完完成 / 会触发发流程实例的的继续执行。  asserttSame(proceessDeffinitiion.geetNodee("endd"), ttoken.getNoode(); 1.5 定制动动作示例动作是一种绑定定你自己的定定制代码到jjBPM流程程的机制。动动作可以与它它自己的节点点(如果它们们与流程的图图形化表示是是相关的)相相关联。动作作也可以被放放置在事件上上,如执行转转换、离开节节点或者进入入节点;如果果那样的话,动动作则不是图图形化表示的的一部分,但但是在流程执执行运行时,当当执行触发事事件时,它们们会被执行。我们先看一下将将要在我们的的例子中使用用的动作实现现:MyAcctionHHandleer,这个动动作处理实现现实际上没有有做任何事仅仅是设置置布尔变量iisExeccuted为为true。变变量isExxecuteed是一个静静态变量,因因此它可以在在动作处理的的内部访问(即即内部方法中中),也可以以从动作(即即在动作类上上)验证它的的值。有关动作的更多多信息可以在在“9.5 动作”中找找到。/ MyAcctionHHandleer 是一个个在jBPMM流程执行期期间可以执行行用户代码的的类。public classs MyAcctionHHandleer impplemennts AcctionHHandleer   / 在每个个测试之前(在 settUp方法中中), issExecuuted 成成员被设置为为falsee。 publicc stattic boooleann isExxecuteed = ffalse;   / 动作将将设置isEExecutted为trrue,当动动作被执行之之后,单元测测试会 / 展示。 publicc voidd execcute(EExecuttionCoontextt execcutionnConteext)     isEExecutted = true; 就象前面所提示示那样,在每每个测试之前前,我们将设设置静态域MMyActiionHanndler.isExeecutedd为falsse。 / 每个测测试都将以设设置MyAcctionHHandleer的静态成成员isExxecuteed  / 为faalse开始始。 publicc voidd setUUp()     MyAActionnHandller.issExecuuted = falsse; 我们将会在转换换上开始一个个动作。public void testTTransiitionAActionn()     / 下面的流程程与helllo worrld 流程程不同。我们们在从状态“ss”到    / 结束状态的的转换上增加加了一个动作作。这个测试试的目的就是是展示     / 集成javva代码到一一个jBPMM流程是多么么的容易。    ProocessDDefiniition proceessDeffinitiion = ProceessDeffinitiion.paarseXmmlStriing(      ""<proccess-ddefiniition>>" +      "" <staart-sttate>"" +      ""    <<transsitionn to=''s' />>" +      "" </sttart-sstate>>" +      "" <staate naame='ss'>" +      ""    <<transsitionn to=''end'>>" +      ""      <actiion cllass=''org.jjbpm.ttutoriial.acction.MyActtionHaandlerr' />"" +      ""    <</trannsitioon>" +      "" </sttate>"" +      "" <endd-statte namme='ennd' />>" +      ""</proocess-definnitionn>"    );        / 让我们为流流程定义起动动一个新的执执行。    ProocessIInstannce prrocesssInstaance =       nnew PrrocesssInstaance(pprocesssDefiinitioon);        / 下面的信号号会导致执行行离开开始状状态,进入状状态“s”。     proocessIInstannce.siignal();     / 这里我们展展示MyAcctionHHandleer还没有被被执行。    asssertFaalse(MMyActiionHanndler.isExeecutedd);   / . 并且且执行的主路路径被定位在在状态“s”。    asssertSaame(prrocesssDefinnitionn.getNNode(""s"),                  prrocesssInstaance.ggetRoootTokeen().ggetNodde();        / 下面的信号号将触发根令令牌的执行,令令牌将会执行行带有动作的的转换,     / 并且在调用用signaal方法期间间动作经会被被执行tokken。    proocessIInstannce.siignal();        / 我们可以看看到MyAcctionHHandleer在调用ssignall方法期间被被执行了。    asssertTrrue(MyyA

    注意事项

    本文(jBPM实例开发5842.docx)为本站会员(you****now)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开