




已阅读5页,还剩128页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第1章介绍JBOSSJBPM是一个灵活的、可扩展的工作流管理系统。JBOSSJBPM拥有直观的流程语言,用任务、异步的等待状态、定时器、自动化动作等来表示业务流程图,把这些操作绑定在一起,JBOSSJBPM就拥有了非常强大和可扩展的控制流机制。JBOSSJBPM只有最小的依赖,可以象使用JAVA库一样非常容易的使用它。另外,也可以通过把它部署在J2EE集群应用服务器中,用在吞吐量极为关键的环境中。JBOSSJBPM可被配置为任何数据库,并且可以部署到任何应用服务器。11概述核心工作流和BPM功能被打包为一个简单的JAVA库,这个库包括一个存储到数据库、从数据库更新和获取流程信息的服务。图11JBOSSJBPM组件概观12JBOSSJBPM入门套件入门套件是一个包含了所有JBPM组件的下载包,包括LJBPMSERVER,一个预配置好的JBOSS应用服务器。LJBPMDESIGNER,图形化设计JBPM流程的ECLIPSE插件。LJBPMDB,JBPM数据库兼容包(见下文)。LJBPM,核心JBPM组件,包括库和本指南。LJBPMBPEL,JBOSSJBPMBPEL扩展参考。预配置好的JBOSS应用服务器安装了下列组件L核心的JBPM组件,被打包为了一个服务档案。L一个包括JBPM库表的集成数据库默认的HYPERSONIC数据库包含了JBPM表,另外还包含一个流程。LJBPM控制台WEB应用程序,可以由流程参与者使用,也可以由JBPM管理员使用。LJBPM调度程序,用于定时器执行。调度程序在入门套件中被配置为一个SERVLET,这个SERVLET将产生一个线程来监视和执行定时器。LJBPM命令执行器,用于命令的异步执行。命令执行器也被配置为一个SERVLET,这个SERVLET将产生一个线程来监视和执行命令。L一个流程实例,已经被部署到了JBPM数据库中。13JBOSSJBPM图形化流程设计器JBOSSJBPM还包括一个图形化设计工具,这个设计器是一个创作业务流程的图形化工具。JBOSSJBPM图形化流程设计器是一个ECLIPSE插件,可以独立安装的设计器已经在开发目标中。图形化设计器非常重要的特性是它同时支持业务分析者和技术开发者,这使的业务流程建模可以平滑的转换到实际实现。插件可以被用作本地更新设置(普通的ZIP文件),通过标准的ECLIPSE软件更新机制安装。另外还有一个包,你可以直接把它解压到ECLIPSE主目录里。14JBOSSJBPM核心组件JBOSSJBPM核心组件是普通JAVAJ2SE软件,用来管理流程定义和流程实例执行的运行时环境。JBOSSJBPM是一个JAVA库,因此,它可以被用在任何JAVA环境,例如WEB应用、SWING应用、EJB、WEBSERVICE等,JBPM库还可以被打包为无状态会话EJB,这允许被作为集群部署,并且适用于极高的吞吐量。无状态会话EJB按照J2EE13规范编写,因此它可以部署到任何应用服务器。JBOSSJBPM核心组件被打包为一个简单的JAVA库文件,依赖于你所使用的功能,JBPM30JAR库对第三方库有些依赖,如HIBERNATE、DOM4J和其他,这些在“第5章部署”TODO中有清晰的说明。为了持久化,JBPM内部使用HIBERNATE,除了传统的O/R影射之外,HIBERNATE还解决了不同数据库之间的SQL方言(DIALECT)问题,使JBPM可以方便的在当前所有数据库上移植。JBOSSJPBMAPI可以从你的项目中任何定制的JAVA软件中访问,例如你的WEB应用、你的EJB、你的WEBSERVICE组件、你的消息驱动BEAN,或者其他JAVA组件。15JBOSSJBPM控制台WEB应用程序JBPM控制台WEB应用程序服务于两个目的。首先,它作为与由流程执行所产生的运行时任务相交互的一个重要的用户接口;其次,它是一个管理和监控控制台,允许检查和操纵运行时实例。16JBOSSJBPM身份组件JBOSSJBPM可以与任何包含用户或其他组织信息目录的公司集成,但是对于没有组织信息组件可用的项目,JBOSSJBPM包含了它自己的组件。身份组件所使用的模型比传统的SERVLET、EJB和PORTLET(译者注PORTLET是PORTAL中最重要的组件,与SERVLET类似,PORTLET是部署在容器中用来生成动态内容的WEB组件。)模型更丰富。更多信息,请看“1111身份组件”。TODO17JBOSSJBPM调度程序JBOSSJBPM调度程序是一个用来监视和执行定时器的组件,它在流程执行期间被调度。定时器组件软件被打包进核心的JBPM库,但是它需要被部署进下列环境之一要么配置调度程序SERVLET去产生监视线程,要么用调度程序的MAIN方法启动一个独立的JVM。18JBOSSJBPM数据库兼容包JBOSSJBPM数据库兼容包是一个包含能使JBPM在你所选择的数据库上运行的所有信息、驱动程序和脚本的下载包。19JBOSSJBPMBPEL扩展JBOSSJBPMBPEL扩展是一个独立的扩展包,它扩展了JBPM,使之支持BPEL(BUSINESSPROCESSEXECUTIONLANGUAGE商业流程执行语言),BPEL本质上是一个XML脚本语言,用来根据其他WEB服务(WEBSERVICES)编写WEB服务(WEBSERVICES)。第2章开始这一章告诉你如何下载并安装JBOSSJBPM。21下载概述下面列出的是在JBPM网站上可以获得的JBPM包。每一个包由一个或多个可下载的文件组成,每一个文件都包括其内容描述和相关安装指示的链接。下面所有包的下载链接都在JBPM源文件下载页。211JBPM3在SOURCEFORGENET上下载JBOSSJBPM3(可选择最新版本下载)。这些是主要的部署DISTRIBUTION包,包括核心引擎和一些使用JBPM工作时可能会需要的附加模块。启动工具包JBPMSTARTERSKITZIP如果你想快速开始JBPM,请下载文件JBPMSTARTERSKITZIP。它包括图形设计器和运行JBPM需要的所有其他模块(所以,只需下载此模块即可运行JBPM)。把ZIP文件解压缩并阅读READMEHTML文件以获得更多信息和进一步的安装指示有了这个启动工具包,你可以跳过下面的步骤立即开始第三章核心引擎和鉴别组件JBPMZIP此压缩文件包括JBPM核心引擎和用于管理参与者和组的鉴别组件把ZIP文件解压缩之后打开JBPM文件夹里的READMEHTML文件,你会发现本用户指南和其他重要信息资源的链接数据库扩展JBPMDBZIP此包是JBPM3的数据库兼容包。此包有两个作用一是为JBPM3运行在你的数据库上提供尽可能的支持;二是为JBPM质量保证(QA)组对所有支持的数据库集成提供测试环境。212JBPM流程设计器在SOURCEFORGENET网站下载JBOSSJBPM流程设计器这个设计器是ECLIPSE插件,可以帮助你创建流程定义并方便的部署这些定义这个插件可以是压缩的ECLIPSEFEATURE也可是是压缩的ECLIPSE更新网址UPDATESITE两者内容相同,只是安装方式不同ECLIPSE更新网址(UPDATESITE)JBPMGPDSITEZIP如果你确定设计器的安装顺利,我们建议重新安装ECLIPSE并使用更新网址机制。当然,ECLIPSE版本应该与下载的网站存档文件一致。阅读根文件夹ROOT中的READMEHTML文件,根据文件中的指示正确安装GPD。ECLIPSEFEATUREJBPMGPDFEATUREZIP如果你厌倦了每次都要重新安装ECLIPSE并愿意处理可能出现的问题,你可以尝试下载FEATURE包。这样,安装变得非常简单,你只要把FEATURES和PLUGINS文件夹解压缩到ECLIPSE安装根目录替换原有同名文件夹即可。但是,你可能会遇到PLUGINS和FEATURES不兼容的问题。安装指示参见“READMEHTML”文件。213JBPMBPEL扩展在SOURCEFORGENET网站上下载JBOSSJBPMBPEL扩展它只包括一个文件JBPMBPELZIP阅读“DOC”子文件夹下的用户指南(USERSGUIDE)。22JBOSSJBPM项目目录专业支持JBOSS公司对JBPM项目有专业的支持,培训和咨询服务。用户指南是项目的入口点。论坛可以交流,提问和讨论JBPM的社区。WIKI主要是社区提供额外信息。发布跟踪器发布错误(BUGS)和请求FEATURES。邮件列表声明的列表。JAVADOCSDOC/JAVADOC目录的部分下载。23CVS入口231匿名CVS入口你可以选择从CVS获得以下信息连接类型PSERVER用户ANONYMOUS主机ANONCVSFORGEJBOSSCOM端口2401(默认)资料库地址/CVSROOT/JBPMLABELPSERVERANONYMOUSANONCVSFORGEJBOSSCOM/CVSROOT/JBPM232开发者CVS入口为了得到CVS开发者入口,你必须签署捐助人协议并需要一个SSH密钥。更多信息在JBOSSCVS资料库WIKI页CONNECTIONTYPEEXTOVERSSHEXTSSHINECLIPSEUSERSFNETUSERNAMEORJBOSSUSERNAMEHOSTCVSFORGEJBOSSCOMPORT2401WHICHISTHEDEFAULTREPOSITORYPATH/CVSROOT/JBPMLABELPSERVERANONYMOUSCVSFORGEJBOSSCOM/CVSROOT/JBPM第3章指南这个指南将向你展示如何用JPDL创建基本的流程以及如何使用API管理运行期的执行。这个指南的形式是解释一组示例,每个示例集中于一个特殊的主题,并且包含大量的注释,这些例子也可以在JBPM下载包的目录SRC/JAVAEXAMPLES中找到。最好的学习方法就是建立一个工程,并且通过在给定例子上做不同的变化进行实验。对ECLIPSE用户来说可以如下方式开始下载JBPM30VERSIONZIP并且解压到自己的系统,然后执行菜单“FILE”“IMPORT”“EXISTINGPROJECTINTOWORKSPACE”,然后点击“NEXT”,浏览找到JBPM根目录,点击“FINISH”。现在,在你的工作区中就有了一个JBPM3工程,你可以在SRC/JAVAEXAMPLES/下找到本指南中的例子,当你打开这些例子时,你可以使用菜单“RUN”“RUNAS”“JUNITTEST”运行它们。JBPM包含一个用来创作例子中展示的XML的图形化设计器工具,你可以在“21下载概述”中找到这个工具的下载说明,但是完成本指南不需要图形化设计器工具。31HELLOWORLD示例一个流程定义就是一个有向图,它由节点和转换组成。HELLOWORLD流程有三个节点,下面来看一下它们是怎样组装在一起的,我们以一个简单的流程作为开始,不用使用设计器工具,下图展示了HELLOWORLD流程的图形化表示图31HELLOWORLD流程图PUBLICVOIDTESTHELLOWORLDPROCESS/这个方法展示了一个流程定义以及流程定义的执行。/这个流程定义有3个节点一个没有命名的开始状态,/一个状态“S”,和一个名称为“END”的结束状态。/下面这行是解析一段XML文本到PROCESSDEFINITION对象(流程定义)。/PROCESSDEFINITION把一个流程的规格化描述表现为JAVA对象。PROCESSDEFINITIONPROCESSDEFINITIONPROCESSDEFINITIONPARSEXMLSTRING“/下面这行是创建一个流程定义的执行。创建后,流程执行有一个/主执行路径(根令牌),它定位在开始状态。PROCESSINSTANCEPROCESSINSTANCENEWPROCESSINSTANCEPROCESSDEFINITION/创建后,流程执行有一个主执行路径(根令牌)。TOKENTOKENPROCESSINSTANCEGETROOTTOKEN/创建后,主执行路径被定位在流程定义的开始状态。ASSERTSAMEPROCESSDEFINITIONGETSTARTSTATE,TOKENGETNODE/让我们开始流程执行,通过它的默认转换离开开始状态。TOKENSIGNAL/SIGNAL方法将会把流程阻塞在一个等待状态。/流程执行进入第一个等待状态“S”,因此主执行路径现在定位/在状态“S”。ASSERTSAMEPROCESSDEFINITIONGETNODE“S“,TOKENGETNODE/让我们发送另外一个信号,这将通过使用状态“S”的默认转换/离开状态“S”,恢复流程执行。TOKENSIGNAL/现在SIGNAL方法将返回,因为流程示例已经到达结束状态。ASSERTSAMEPROCESSDEFINITIONGETNODE“END“,TOKENGETNODE32数据库示例JBPM的特性之一就是在流程等待状态时,拥有把流程的执行持久化到数据库中的能力。下面的例子将向你展示怎样存储一个流程实例到数据库,例子中还会出现上下文。分开的方法被用来创建不同的用户代码,例如,一段代码在WEB应用中启动一个流程并且持久化执行到数据库,稍后,由一个消息驱动BEAN从数据库中加载流程实例并且恢复它的执行。有关JBPM持久化的更多信息可以在“第7章持久化”找到。PUBLICCLASSHELLOWORLDDBTESTEXTENDSTESTCASESTATICJBPMCONFIGURATIONJBPMCONFIGURATIONNULLSTATIC/在“SRC/CONFIGFILES”可以找到象下面这样的一个示例配置文件。/典型情况下,配置信息在资源文件“JBPMCFGXML”中,但是在这里/我们通过XML字符串传入配置信息。/首先我们创建一个静态的JBPMCONFIGURATION。一个JBPMCONFIGURATION/可以被系统中所有线程所使用,这也是为什么我们可以把它安全的设置/为静态的原因。JBPMCONFIGURATIONJBPMCONFIGURATIONPARSEXMLSTRING“/JBPMCONTEXT机制分离了JBPM核心引擎和来自于外部环境的服务。“/同样,JBPM使用的所有资源文件在JBPMCFGXML中被提供。“PUBLICVOIDSETUPJBPMCONFIGURATIONCREATESCHEMAPUBLICVOIDTEARDOWNJBPMCONFIGURATIONDROPSCHEMAPUBLICVOIDTESTSIMPLEPERSISTENCE/在下面调用的3个方法之间,所有的数据通过数据库被传递。/在这个测试中,这3个方法被依次执行,因为我们想要测试一个/完整的流程情景。但是实际上,这些方法表示了对服务器的不同/请求。/因为我们以一个干净的空数据库开始,所以我们首先必须部署流程。/事实上,这只需要由流程开发者做一次。DEPLOYPROCESSDEFINITION/假设在一个WEB应用中当用户提交一个表单时我们起动一个流程/实例(流程执行)PROCESSINSTANCEISCREATEDWHENUSERSUBMITSWEBAPPFORM/然后,一个异步消息到达时继续执行。THEPROCESSINSTANCECONTINUESWHENANASYNCMESSAGEISRECEIVEDPUBLICVOIDDEPLOYPROCESSDEFINITION/这个测试展示了一个流程定义以及流程定义的执行。/这个流程定义有3个节点一个没有命名的开始状态,/一个状态“S”,和一个名称为“END”的结束状态。PROCESSDEFINITIONPROCESSDEFINITIONPROCESSDEFINITIONPARSEXMLSTRING“/查找在上面所配置的POJO持久化上下文创建器。JBPMCONTEXTJBPMCONTEXTJBPMCONFIGURATIONCREATEJBPMCONTEXTTRY/部署流程定义到数据库中。JBPMCONTEXTDEPLOYPROCESSDEFINITIONPROCESSDEFINITIONFINALLY/关闭POJO持久化上下文。这包含激发(FLUSH)SQL语句把流程/定义插入到数据库。JBPMCONTEXTCLOSEPUBLICVOIDPROCESSINSTANCEISCREATEDWHENUSERSUBMITSWEBAPPFORM/本方法中的代码可以被放在STRUTS的ACTIONG中,或JSF管理/的BEAN中。/查找在上面所配置的POJO持久化上下文创建器。JBPMCONTEXTJBPMCONTEXTJBPMCONFIGURATIONCREATEJBPMCONTEXTTRYGRAPHSESSIONGRAPHSESSIONJBPMCONTEXTGETGRAPHSESSIONPROCESSDEFINITIONPROCESSDEFINITIONGRAPHSESSIONFINDLATESTPROCESSDEFINITION“HELLOWORLD“/使用从数据库中获取的流程定义可以创建一个流程定义的执行/就象在HELLOWORLD例子中那样(该例没有持久化)。PROCESSINSTANCEPROCESSINSTANCENEWPROCESSINSTANCEPROCESSDEFINITIONTOKENTOKENPROCESSINSTANCEGETROOTTOKENASSERTEQUALS“START“,TOKENGETNODEGETNAME/让我们起动流程执行TOKENSIGNAL/现在流程在状态S。ASSERTEQUALS“S“,TOKENGETNODEGETNAME/现在流程实例PROCESSINSTANCE被存储到数据库,/因此流程执行的当前状态也被存储到数据库。JBPMCONTEXTSAVEPROCESSINSTANCE/以后我们可以从数据库再取回流程实例,并且通过提供另外一个/信号来恢复流程执行。FINALLY/关闭POJO持久化上下文。JBPMCONTEXTCLOSEPUBLICVOIDTHEPROCESSINSTANCECONTINUESWHENANASYNCMESSAGEISRECEIVED/本方法中的代码可以作为消息驱动BEAN的内容。/查找在上面所配置的POJO持久化上下文创建器。JBPMCONTEXTJBPMCONTEXTJBPMCONFIGURATIONCREATEJBPMCONTEXTTRYGRAPHSESSIONGRAPHSESSIONJBPMCONTEXTGETGRAPHSESSION/首先,我们需要从数据库中取回流程实例。/有几个可选方法来分辨出我们在这里所要处理的流程实例。/在这个简单的测试中,最容易的方式是查找整个流程实例列表,/这里它应该只会给我们一个结果。/首先,让我们查找流程定义。PROCESSDEFINITIONPROCESSDEFINITIONGRAPHSESSIONFINDLATESTPROCESSDEFINITION“HELLOWORLD“/现在我们搜索这个流程定义的所有流程实例。LISTPROCESSINSTANCESGRAPHSESSIONFINDPROCESSINSTANCESPROCESSDEFINITIONGETID/因为我们知道在这个单元测试中只有一个执行。/在实际情况中,可以从所到达的信息内容中提取PROCESSINSTANCEID/或者由用户来做选择。PROCESSINSTANCEPROCESSINSTANCEPROCESSINSTANCEPROCESSINSTANCESGET0/现在我们可以继续执行。注意PROCESSINSTANCE将委托信号/到主执行路径(根令牌)。PROCESSINSTANCESIGNAL/在这个信号之后,我们知道流程执行应该到达了结束状态。ASSERTTRUEPROCESSINSTANCEHASENDED/现在我们可以更新数据库中的执行状态。JBPMCONTEXTSAVEPROCESSINSTANCEFINALLY/关闭POJO持久化上下文。JBPMCONTEXTCLOSE33上下文示例流程变量流程变量包含了流程执行期间的上下文信息,流程变量与一个JAVAUTILMAP相似,它影射变量名称和值,值是JAVA对象,流程变量作为流程实例的一部分被持久化。为了让事情简单,在这里的例子中我们只是展示使用变量的API,而没有持久化。有关变量的更多信息可以在“第10章上下文”中找到。/这个例子仍然从HELLOWORLD流程开始,甚至没有修改。PROCESSDEFINITIONPROCESSDEFINITIONPROCESSDEFINITIONPARSEXMLSTRING“PROCESSINSTANCEPROCESSINSTANCENEWPROCESSINSTANCEPROCESSDEFINITION/从流程实例获取上下文实例,用来使用流程变量。CONTEXTINSTANCECONTEXTINSTANCEPROCESSINSTANCEGETCONTEXTINSTANCE/在流程离开开始状态之前,我们要在流程实例的上下文中/设置一些流程变量。CONTEXTINSTANCESETVARIABLE“AMOUNT“,NEWINTEGER500CONTEXTINSTANCESETVARIABLE“REASON“,“IMETMYDEADLINE“/从现在开始,这些流程变量与流程实例相关联。现在展示由用户代码通过/API访问流程变量,另外,这些代码也可以存在于动作或节点的实现中。/流程变量被作为流程实例的一部分也被存储到数据库中。PROCESSINSTANCESIGNAL/通过CONTEXTINSTANCE访问流程变量。ASSERTEQUALSNEWINTEGER500,CONTEXTINSTANCEGETVARIABLE“AMOUNT“ASSERTEQUALS“IMETMYDEADLINE“,CONTEXTINSTANCEGETVARIABLE“REASON“34任务分配示例下一个例子我们将向你展示怎样分配一个任务到用户。因为JBPM工作流引擎与组织模型是独立的,所以任何一种用来计算参与者的表达式语言都是有限制的,因此,你不得不指定一个ASSIGNMENTHANDLER实现,用来包含任务参与者的计算。PUBLICVOIDTESTTASKASSIGNMENT/下面的流程基于HELLOWORLD流程。状态节点被一个TASKNODE节点/所替换。TASKNODEJPDL中的一类节点,它表示一个等待状态并且产生/将要完成的任务,这些任务在流程继续之前被执行。PROCESSDEFINITIONPROCESSDEFINITIONPROCESSDEFINITIONPARSEXMLSTRING“/创建一个流程定义的执行。PROCESSINSTANCEPROCESSINSTANCENEWPROCESSINSTANCEPROCESSDEFINITIONTOKENTOKENPROCESSINSTANCEGETROOTTOKEN/让我们起动流程执行,通过默认转换离开开始状态TOKENSIGNAL/SIGNAL方法将会把流程阻塞在一个等待状态,/在这里,就是阻塞在TASKNODE。ASSERTSAMEPROCESSDEFINITIONGETNODE“T“,TOKENGETNODE/当执行到达TASKNODE,一个CHANGENAPPY任务被创建,并且/NAPPYASSIGNMENTHANDLER被调用,来决定任务将要分配给谁。/NAPPYASSIGNMENTHANDLER返回PAPA。/在一个实际环境中,将使用ORGJBPMDBTASKMGMTSESSION中的方法/从数据库获取任务。因为我们不想在这个例子中包含复杂的持久化,/所以我们仅使用这个流程实例的第一个任务实例(我们知道,在这个/测试情景,只有一个任务)。TASKINSTANCETASKINSTANCETASKINSTANCEPROCESSINSTANCEGETTASKMGMTINSTANCEGETTASKINSTANCESITERATORNEXT/现在我们检查TASKINSTANCE是否真正的分配给了PAPA。ASSERTEQUALS“PAPA“,TASKINSTANCEGETACTORID/现在我们假设PAPA已经完成了他的职责,并且标示任务为已完成。TASKINSTANCEEND/因为这是要做的最后一个任务(也是唯一一个),所以任务的完成/会触发流程实例的继续执行。ASSERTSAMEPROCESSDEFINITIONGETNODE“END“,TOKENGETNODE35定制动作示例动作是一种绑定你自己的定制代码到JBPM流程的机制。动作可以与它自己的节点(如果它们与流程的图形化表示是相关的)相关联。动作也可以被放置在事件上,如执行转换、离开节点或者进入节点;如果那样的话,动作则不是图形化表示的一部分,但是在流程执行运行时,当执行触发事件时,它们会被执行。我们先看一下将要在我们的例子中使用的动作实现MYACTIONHANDLER,这个动作处理实现实际上没有做任何事仅仅是设置布尔变量ISEXECUTED为TRUE。变量ISEXECUTED是一个静态变量,因此它可以在动作处理的内部访问(即内部方法中),也可以从动作(即在动作类上)验证它的值。有关动作的更多信息可以在“95动作”中找到。/MYACTIONHANDLER是一个在JBPM流程执行期间可以执行用户代码的类。PUBLICCLASSMYACTIONHANDLERIMPLEMENTSACTIONHANDLER/在每个测试之前在SETUP方法中,ISEXECUTED成员被设置为FALSE。PUBLICSTATICBOOLEANISEXECUTEDFALSE/动作将设置ISEXECUTED为TRUE,当动作被执行之后,单元测试会/展示。PUBLICVOIDEXECUTEEXECUTIONCONTEXTEXECUTIONCONTEXTISEXECUTEDTRUE就象前面所提示那样,在每个测试之前,我们将设置静态域MYACTIONHANDLERISEXECUTED为FALSE。/每个测试都将以设置MYACTIONHANDLER的静态成员ISEXECUTED/为FALSE开始。PUBLICVOIDSETUPMYACTIONHANDLERISEXECUTEDFALSE我们将会在转换上开始一个动作。PUBLICVOIDTESTTRANSITIONACTION/下面的流程与HELLOWORLD流程不同。我们在从状态“S”到/结束状态的转换上增加了一个动作。这个测试的目的就是展示/集成JAVA代码到一个JBPM流程是多么的容易。PROCESSDEFINITIONPROCESSDEFINITIONPROCESSDEFINITIONPARSEXMLSTRING“/让我们为流程定义起动一个新的执行。PROCESSINSTANCEPROCESSINSTANCENEWPROCESSINSTANCEPROCESSDEFINITION/下面的信号会导致执行离开开始状态,进入状态“S”。PROCESSINSTANCESIGNAL/这里我们展示MYACTIONHANDLER还没有被执行。ASSERTFALSEMYACTIONHANDLERISEXECUTED/并且执行的主路径被定位在状态“S”。ASSERTSAMEPROCESSDEFINITIONGETNODE“S“,PROCESSINSTANCEGETROOTTOKENGETNODE/下面的信号将触发根令牌的执行,令牌将会执行带有动作的转换,/并且在调用SIGNAL方法期间动作经会被执行TOKEN。PROCESSINSTANCESIGNAL/我们可以看到MYACTIONHANDLER在调用SIGNAL方法期间被执行了。ASSERTTRUEMYACTIONHANDLERISEXECUTED下一个例子展示了相同的动作,但是现在动作分别被放置在了ENTERNODE和LEAVENODE事件上。注意,节点与转换相比有更多的事件类型,而转换只有一个,因此动作要放置在节点上应该放入一个EVENT元素中。PROCESSDEFINITIONPROCESSDEFINITIONPROCESSDEFINITIONPARSEXMLSTRING“PROCESSINSTANCEPROCESSINSTANCENEWPROCESSINSTANCEPROCESSDEFINITIONASSERTFALSEMYACTIONHANDLERISEXECUTED/下面的信号会导致执行离开开始状态,进入状态“S”,/因此状态S被进入,动作被执行。PROCESSINSTANCESIGNALASSERTTRUEMYACTIONHANDLERISEXECUTED/我们重新设置MYACTIONHANDLERISEXECUTED。MYACTIONHANDLERISEXECUTEDFALSE/下一个信号将会触发执行离开状态S,因此动作将被执行。PROCESSINSTANCESIGNAL/请看ASSERTTRUEMYACTIONHANDLERISEXECUTED第4章面向图表编程(内容不全)41介绍本章给出一个完全的现在的JBOSSJBPM策略和未来的方向。首先,有多种处理语言,它们应用于不同的环境和目的,需要特殊的处理语言。第二,面向图表编程是一个新的服务于基于图表的业务处理语言的实现技术。现在的软件开发依赖于越来越多的特定领域语言。一个典型的JAVA开发者将使用相当多的DSL。XML文件被许多DSL语言所使用。配置基于图表的语言工作流、业务处理管理、管弦乐作曲法、页面流的DSL是基于直接的图表执行的。面向图表编程是所有基于图表执行的DSL的基础。411特定领域语言每一个处理语言可以比看作是DSL特定领域语言。DSL让开发者能够非常好的使用简单OO编程来处理。BPM业务处理管理套件产品是完整的软件开发环境。它们是以业务处理为中心的。这类产品中,应该避免用编程语言编码。而应该使用DSL语言进行配置。DSL语言的一个重要的方面是,每一个语言应该有一个特定的语法。语法被表示为一个领域模型。例如,JAVA包括类、方法、字段、构造器等。JPDL包括节点、转向、动作等。RULES规则语言是条件,CEQUENCE等。DSL的主要思想是,开发者用一种特殊的语言创造东西。用这种语言比一般的通用领域语言表达能力更强。一种DSL语言,可以使用多种编辑器编辑。如,JPDL语言可以使用图形化编辑器或者手工编写XML源码来编写。过去,程序员主要工作是写JAVA这样的通用编程语言的代码。今天,程序员需要些越来越多的DSL。这种趋势将会继续下去。DSL将会占据越来越多的领域,支持DSL的框架将会越来越多。JBOSSSEAM和SPRING就是其中的代表。元数据编程,DSL将会进一步发展下去DSL中的一些语言基于图表来执行。例如,JAVA的工作流语言JPDL,面向服务架构的BPEL,页面流SEAM等。面向图表编程是所有这些流程型的DSL共同的基础。在将来,对于每一种语言,可能会有更多的编辑器可供选择。如,JAVA横序员既可以直接编写源码,也可以使用图形化工具来操作,生成JAVA源码。如UML等。另一个看待那些DSL语言和其他编程语言的角度是,软件结构的前景。OOP通过把数据和方法组合在一起增加了结构。OOP提取公共方面。DI和IOC(依赖注入和反向控制它们是一回事)提供了容易的装配对象的方法。基于图表的执行语言有助于解决你的软件在执行图表方面的部分结构的复杂性问题。412基于图表语言的特性有众多的基于图表的处理语言。它们的使用环境和目标有着巨大的差异。路例如,BPEL是一个基于XML格式的服务组件,是ESB(企业服务总线)架构的顶层。一个页面流处理语言可能定义WEB应用程序的页面之间如何导航。这是两个完全不同的领域。不管它们有多大的不同,你可以发现几乎所有处理语言有2个特性是一样的1,支持等待状态2,图形化表示;在OO编程语言中不是十分支持这2个特性。基于图表编程是一个在OO编程语言中实现这2个特性的技术。所有面向图表编程的功能都依赖于OO语言去开发。但这并不意味着处理语言暴露底层OO的实现。例如,BPEL不关联任何OO编程语言,它能被面向图表编程所实现。4121支持等待状态JAVA等命令式语言会飞快地执行序列化的指令,没有等待指令。(实际有,可以让线程等待)但那样一个请求是一个更大的情节中的一部分。例如,一个客户端提交一份购买订单。一个订单管理者确认订单有效,然后信息进入ERP系统。所以程序语言是描述更大场景的语言。一个非常重要的区别是,一个系统内部的执行和多个系统的协议。面向图表语言的实现技术仅仅用于在一台机器上执行的程序语言。所以,一个管弦乐程序描述一个系统的整个期间的情节。例如一个程序开始于一个客户端提交订单。程序中的下一步是订单管理员承认。所以,系统必须在订单经理的任务列表上增加一个任务,等待订单管理者提供需要的输入。当输入收到以后,程序继续执行。现在,一个消息被发送到ERP系统中,系统将再一次等待知道ERP系统的响应返回。此时,任务结束。所以,对于描述一个系统的整个场景,我们需要一个机制来处理等待状态。应该就是把工作定义的实例保存到数据库中。在多数程序中,等待状态应该被持久化。所以线程不能充分支持等待状态。CONTINUATIONS续集是一种持久化线程(和线程上下文变量)的技术。虽然它也能够支持等待状态,但是,基于命令式编程语言的“CONTINUATIONS续集”不适合图形化表示。所以,最好的支持等待状态的技术,是把程序执行保存起来。不同的应用程序领域对于持久化程序执行有不同的需求。对于大多数工作流、BPM业务程序管理和管弦乐应用程序,程序执行应该被保存在一个关系型数据库中。典型的,在业务程序中的一个状态转换应用使用数据库的一个事务。4122图形表示一些方面的软件开发能够非常好的借助于基于图表的表示方法。业务程序管理BPM是最明显的基于图表的的语言的应用程序之一。例如,在软件开发者和业务分析师之间,使用基于图表的图来表示业务程序进行交流。因为,业务程序分析师作为领域专家,并不会使用编程语言。使用基于图表的DSL特定领域语言便于开发者和业务程序分析师之间的交流。另一个能够从图形表示中获益的是页面流。例如,页面的导航和动作命令使用图形化表示的方法显示和链接。STRUTS的配置似乎就是一种页面流。在面向图表编程中,我们的目标是使用图表来代表一些格式的业务程序的执行。这是面向图表编程语言和UML类图等的一个面线的区别。UML类图代表的是OO数据结构的一个静态的模型。面向图表编程,表示的是一系列的业务程序、步骤。类似于UML的活动图。参考1,UML状态图状态图在计算机系统中,当系统和用户(也可能是其他系统)交互的时候,组成系统的对象为了适应交互要经历必要的变化。一种表征系统变化的方法可以说是对想改变了自己的状态以相应事件和时间的流逝。UML状态图就是展示这种变化的工具,它描述了一个对象所处的可能状态及状态间的转移,并给出了状态变化序列的起点和终点。要注意,状态图与以上提到的类图、对象图和用例图有着本质的不同。前3种图能够对一个系统或至少一组类、对象或用例建立模型,而状态图只是对单个对象建立模型。另外,状态图和序列图也不同。序列图关注的是多个对象的状态,以及它们之间的交互。而状态图和活动图表示的是一个对象的状态。状态图描述一段时间内对象所处的状态和状态的变化。状态的UML图标是一个圆角矩形,状态转移用状态之间的有向连线表示。2,UML活动图UML活动图是状态图的一种扩展形式,它展示出对象执行某种行为时或者在业务过程中所要精力的步骤和判定点。每个步骤(活动)用一个圆角矩形(比状态图更扁更圆)表示,菱形图标代表判定点。它很像程序设计课中学到的流程图。UML活动图可用于表达一个对象的操作和一个业务过程。活动图与状态图的主要区别是,状态图图出显示的是状态,而活动图突出显示的是活动。图形化表示也可以被看作是OO编程的一个缺失的特性。OO编程中没有一个方法能够使用图形化表示。所以在OO编程和图形视图之间没有直接的关联。在面向图表编程中,图表的描述是中心,它是真正的软件产品。如,一个XML文件描述业务处理图表。因此,图形化视图是软件的固有部分,它总是同时存在的。不需要手工把图形需求翻译到一个软件设计中。软件的结构是围绕图表的。JBPM的PROCESSDEFINITION生成3个文件。一个是XML格式的业务程序定义文件。一个是XML格式的文件,用来存储元素的位置,另一个是JPG的图形文件,展示业务程序定义的视图。42面向图表编程这里,我们介绍基于图表执行语言的实现技术。这是一种运行时解释的图表。这样,可以灵活的改变图表DSL语言,实现不同的配置和运行结果。其他图表执行的技术是基于消息队列和代码生成。代码生成,如源代码级元数据的代码生成;或者类载入时更改CLASS文件。本节解释我们如何在一门OO编程语言的基础上实现图表执行语言的策略。对于那些熟悉设计模式的人来说,这是命令模式和责任链模式的结合。(都属于行为模式)责任链模式让多个处理对象能够处理一个请求。命令模式,使用“接口实现类”的方式。一般作为参数把接口传给调用方法。它能够去除调用方法的条件判断代码。这是“重构”中经常用到的一种模式,常常用来去除代码中的条件判断语句。我们首先从最简单的模型开始,一步一步扩展它。421图表结构首先,图表的结构使用“节点”/(状态)和“转向”/(流程箭头)来表示。“转向”有方向性。所以,“节点”有离开和到达“转向”。节点和转向类节点使用了命令模式,只有一个方法。一个节点是一个命令,有一个执行方法。节点的子类支持覆盖这个执行方法,根据节点的类型实现不同的方法。422一个执行我们定义在图表结构上的执行模型看上去类似于有限状态机或者UML的状态图。实际上,面向图表编程能实现这些行为,还能做得更多。一个执行(JBPM是TOKEN记号类,叫做“业务程序流程”比较合适,是一次业务程序实例的一个流程。)使用一个叫做EXECUTION执行的类来表示。一个执行指向现有的节点。FIGURE43执行类转向能够传递执行EXECUTIONCONTEXT给TAKE方法。执行会从从源节点到达目标节点。JBPM中,TOKEN等类的SIGNAL方法表示一次“转向”动作的执行。FIGURE44转向的TAKE方法转向节点转向节点当一个执行到达节点后,这个节点也会被执行。这个执行也会把执行传递下去。通过转向,执行点到达下一个节点。FIGURE45节点执行方法参考1,JBPM中,状态有4种匹配事件的动作2,转向只有一个动作。3,动作可以有类CLASS。会调用该“动作处理器”的唯一方法。节点/状态有2种执行方式。一种是类似于JAVA等命令式的编程语言,一步步往下走;另一种节点是等待状态。要等待触发。JBPM中是单步执行,如果需要等待,可以先把“业务程序执行流程”保存进数据库中。如果节点没有上面那样的EXECUTE执行方法,那么就像START节点那样是一个等待状态,需要触发事件才能继续执行。JBPM的JPDL中,基本上都是等待状态。需要一步步执行。FIGURE46执行事件方法423一种业务处理语言FIGURE47A一个示例业务处理语言现在,我们能够看看面向图表编程语言支持的2个特性等待状态和图形化表示。在等待状态期间,一个“业务程序的执行”仅仅指向“业务程序定义”的一个节点。业务程序定义/图表和“业务程序的执行”都能够被持久化。如,使用一个类似HIBERNATE的OR映射工具保存到关系数据库中,或者序列化一个对象到文件中。你也能看到一个图表/“业务程序定义”的节点和转向。因此,这也是一个与可视化表示的直接结合。一个业务处理语言除了一系列节点实现之外,没有什么东西。每一个节点实现处理一个业务处理构件。业务处理构件的准确行为由实现类的EXECUTE方法来决定。这里,我们展示一个简单的业务处理语言,它有4个业务处理构件START状态、决定器、任务和END状态。它和JPDL处理语言无关,仅仅为了演示。FIGURE48ANEXAMPLEPROCESS创建一个新的业务程序的业务程序执行时,它位于、指向START节点。FIGURE49一个新的业务程序的执行初始化时,我们激活了默认的事件,这将和默认的转向通讯。事件方法将找到默认的离开转向,传递执行到下一个状态。FIGURE410ANEXECUTIONINTHEDOUBLECHECKWAITSTATE424ACTIONS动作在许多应用程序领域,没有导入一个节点,需要有一个方法包括进一个程序逻辑的执行。在业务处理管理中这是非常重要的一个方面。业务分析员负责业务程序的图形化表示。而开发人员负责是业务程序可执行。开发者不能为了包括一个技术而改变业务程序表示图。一个动作也是一个执行方法的命令。动作能够和事件一起使用。当一个业务程序执行时,节点类有2个基本的事件节点离开和节点进入事件。通过引起转向的事件,能够把程序逻辑很自由的插入到图形表示中。注YES,NO是2个转向,在业务程序执行的代码中进行判断,看应该使用哪条“转向”。FIGURE411动作一般隐藏在视图中每一个事件能够和一系列动作关联。425代码例子PACKAGEORGJBPMGOPIMPORTJAVAUTIL/ANODEINTHEPROCESSGRAPH/PUBLICCLASSNODESTRINGNAME/MAPSEVENTSTOTRANSITIONS节点的转向名/MAPTRANSITIONSNEWHASHMAP/MAPSEVENTSTOACTIONS动作MAP/MAPACTIONSNEWHASHMAPPUBLICNODESTRINGNAMETHISNAMENAME/CREATEANEWTRANSITIONTOTHEDESTINATIONNODEANDASSOCIATEITWITHTHEGIVENEVENT增加一个转向到本节点。指定目标节点和转向的名字。/PUBLICVOIDADDTRANSITIONSTRINGEVENT,NODEDESTINATIONTRANSITIONSPUTEVENT,NEWTRANSITIONDESTINATION/ADDTHEACTIONTOTHEGIVENEVENT给节点增加
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年电子商务平台数据安全防护与监控合同
- 二零二五版企业绿色能源项目投资分红合同
- 2025年度环保产业绿色融资项目利息合同
- 二零二五年度出租车公司车辆外包及安全保障合同
- 2025年生态环保产业园污水处理设备采购、安装及环保达标验收合同
- 二零二五年度商铺转租与旅游文化合作合同
- 2025版城市交通大数据分析合同
- 二零二五年度房产购置合同范本:带健身房
- 2025版城市绿化工程项目施工合同书范本
- 2025版第一人民医院医疗废弃物无害化处理合同
- 山东畜产品质量安全检测(抽样员)职业技能竞赛理论考试题及答案
- (新版)区块链应用操作员职业技能竞赛理论考试题库-下(多选、判断题)
- 短视频创意内容定制合同
- 关节松动技术-下肢关节松动术(运动治疗技术)
- 儿童之家实施可行性方案
- 建设法规(全套课件)
- 大学英语四级考试15选10专项训练及答案
- 2024-2029全球及中国康普茶行业市场发展分析及前景趋势与投资发展研究报告
- 心衰患者的容量管理中国专家共识-共识解读
- 新型冠状病毒肺炎病案分析报告
- 肱骨外科颈骨折(骨科)
评论
0/150
提交评论