BPM业务流程管理BPM实例开发培训课件_第1页
BPM业务流程管理BPM实例开发培训课件_第2页
BPM业务流程管理BPM实例开发培训课件_第3页
BPM业务流程管理BPM实例开发培训课件_第4页
BPM业务流程管理BPM实例开发培训课件_第5页
已阅读5页,还剩68页未读 继续免费阅读

下载本文档

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

文档简介

jBPM实例开发1.概述本处主要将向你展示如何用jpdl创建基本的流程以及如何使用API管理运行期的执行。感谢阅读本处的形式是解释一组示例,每个示例集中于一个特殊的主题,并且包含大量的注释,这精品文档放心下载些例子也可以在jBPM下载包的目录src/java.examples中找到。精品文档放心下载最好的学习方法就是建立一个工程,并且通过在给定例子上做不同的变化进行实验。感谢阅读对eclipsejbpm-3.0-[version].zip并且解压到自己的谢谢阅读系统,然后执行菜单“File”-->“Import…”-->“ExistingProjectintoWorkspace”,然感谢阅读后点击“Next”,浏览找到jBPM根目录,点击“Finish”。现在,在你的工作区中就有了一个精品文档放心下载jbpm.3工程,你可以在src/java.examples/…下找到本指南中的例子,当你打开这些例子时,谢谢阅读你可以使用菜单“Run”-->“RunAs…”-->“JUnitTest”运行它们。感谢阅读jBPM包含一个用来创作例子中展示的XML的图形化设计器工具,你可以在“2.1下载概精品文档放心下载述”中找到这个工具的下载说明,但是完成本指南不需要图形化设计器工具。谢谢阅读1.1HelloWorld示例一个流程定义就是一个有向图,它由节点和转换组成。Helloworld流程有三个节点,下谢谢阅读面来看一下它们是怎样组装在一起的,我们以一个简单的流程作为开始,不用使用设计器工具,谢谢阅读下图展示了helloworld流程的图形化表示:精品文档放心下载图3.1helloworld流程图publicvoidtestHelloWorldProcess(){精品文档放心下载//这个方法展示了一个流程定义以及流程定义的执行。谢谢阅读//这个流程定义有3个节点:一个没有命名的开始状态,精品文档放心下载//一个状态“s”,和一个名称为“end”的结束状态。精品文档放心下载//下面这行是解析一段xml文本到ProcessDefinition对象(流程定义)。感谢阅读//ProcessDefinition把一个流程的规格化描述表现为java对象。感谢阅读ProcessDefinitionprocessDefinition=精品文档放心下载ProcessDefinition.parseXmlString(精品文档放心下载"<process-definition>"+"<start-state>"+"<transitionto='s'/>"+谢谢阅读"</start-state>"+"<statename='s'>"+"<transitionto='end'/>"+谢谢阅读"</state>"+"<end-statename='end'/>"+精品文档放心下载"</process-definition>");//下面这行是创建一个流程定义的执行。创建后,流程执行有一个精品文档放心下载//主执行路径(=根令牌),它定位在开始状态。ProcessInstanceprocessInstance=精品文档放心下载newProcessInstance(processDefinition);精品文档放心下载//创建后,流程执行有一个主执行路径(=根令牌)。谢谢阅读Tokentoken=processInstance.getRootToken();精品文档放心下载//创建后,主执行路径被定位在流程定义的开始状态。精品文档放心下载assertSame(processDefinition.getStartState(),token.getNode());谢谢阅读//让我们开始流程执行,通过它的默认转换离开开始状态。谢谢阅读token.signal();//signal方法将会把流程阻塞在一个等待状态。精品文档放心下载//流程执行进入第一个等待状态“s”,因此主执行路径现在定位感谢阅读//在状态“s”。assertSame(processDefinition.getNode("s"),token.getNode());谢谢阅读//让我们发送另外一个信号,这将通过使用状态“s”的默认转换谢谢阅读//离开状态“s”,恢复流程执行。token.signal();//现在signal方法将返回,因为流程示例已经到达结束状态。精品文档放心下载assertSame(processDefinition.getNode("end"),token.getNode());精品文档放心下载}1.2数据库示例jBPM谢谢阅读谢谢阅读来创建不同的用户代码,例如,一段代码在web应用中启动一个流程并且持久化执行到数据库,谢谢阅读稍后,由一个消息驱动bean从数据库中加载流程实例并且恢复它的执行。精品文档放心下载有关jBPM持久化的更多信息可以在“第7章持久化”找到。谢谢阅读publicclassHelloWorldDbTestextendsTestCase{谢谢阅读staticJbpmConfigurationjbpmConfiguration=null;精品文档放心下载static{//在“src/config.files”可以找到象下面这样的一个示例配置文件。谢谢阅读//典型情况下,配置信息在资源文件“jbpm.cfg.xml”中,但是在这里精品文档放心下载//我们通过XML字符串传入配置信息。//首先我们创建一个静态的JbpmConfigurationJbpmConfiguration精品文档放心下载//可以被系统中所有线程所使用,这也是为什么我们可以把它安全的设置感谢阅读//为静态的原因。jbpmConfiguration=JbpmConfiguration.parseXmlString(谢谢阅读"<jbpm-configuration>"+//jbpm-context机制分离了jbpm核心引擎和来自于外部环境的服务。感谢阅读"<jbpm-context>"+"<servicename='persistence'"+感谢阅读"factory='org.jbpm.persistence.db.DbPersistenceSer谢谢阅读viceFactory'/>"+"</jbpm-context>"+//同样,jbpm使用的所有资源文件在jbpm.cfg.xml中被提供。精品文档放心下载"<stringname='resource.hibernate.cfg.xml'"+感谢阅读"value='hibernate.cfg.xml'/>"+精品文档放心下载"<stringname='resource.business.calendar'"+感谢阅读"value='org/jbpm/calendar/p感谢阅读erties'/>"+"<stringname='resource.default.modules'"+感谢阅读"value='org/jbpm/graph/def/pe精品文档放心下载rties'/>"+"<stringname='resource.converter'"+谢谢阅读"value='org/jbpm/db/hibernate/perti谢谢阅读es'/>"+"<stringname='resource.action.types'"+精品文档放心下载"value='org/jbpm/graph/action/action.types.xml'/>"+谢谢阅读"<stringname='resource.node.types'"+谢谢阅读"value='org/jbpm/graph/node/node.types.xml'/>"+精品文档放心下载"<stringname='resource.varmapping'"+精品文档放心下载"value='org/jbpm/context/exe/jbpm.varmapping.xml'/>"精品文档放心下载+"</jbpm-configuration>");}publicvoidsetUp(){jbpmConfiguration.createSchema();感谢阅读}publicvoidtearDown(){jbpmConfiguration.dropSchema();感谢阅读}publicvoidtestSimplePersistence(){谢谢阅读//在下面调用的3个方法之间,所有的数据通过数据库被传递。精品文档放心下载//在这个测试中,这3个方法被依次执行,因为我们想要测试一个谢谢阅读//完整的流程情景。但是实际上,这些方法表示了对服务器的不同谢谢阅读//请求。//因为我们以一个干净的空数据库开始,所以我们首先必须部署流程。感谢阅读//事实上,这只需要由流程开发者做一次。deployProcessDefinition();精品文档放心下载//假设在一个web应用中当用户提交一个表单时我们起动一个流程谢谢阅读//实例(=流程执行)…processInstanceIsCreatedWhenUserSubmitsWebappForm();谢谢阅读//然后,一个异步消息到达时继续执行。theProcessInstanceContinuesWhenAnAsyncMessageIsReceived();感谢阅读}publicvoiddeployProcessDefinition(){谢谢阅读//这个测试展示了一个流程定义以及流程定义的执行。感谢阅读//这个流程定义有3个节点:一个没有命名的开始状态,精品文档放心下载//一个状态“s”,和一个名称为“end”的结束状态。精品文档放心下载ProcessDefinitionprocessDefinition=精品文档放心下载ProcessDefinition.parseXmlString(感谢阅读"<process-definitionname='helloworld'>"+精品文档放心下载"<start-statename='start'>"+感谢阅读"<transitionto='s'/>"+精品文档放心下载"</start-state>"+"<statename='s'>"+"<transitionto='end'/>"+精品文档放心下载"</state>"+"<end-statename='end'/>"+感谢阅读"</process-definition>");//查找在上面所配置的pojo持久化上下文创建器。精品文档放心下载JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();精品文档放心下载try{//部署流程定义到数据库中。jbpmContext.deployProcessDefinition(processDefinition);谢谢阅读}finally{//关闭pojo持久化上下文。这包含激发(flush)SQL语句把流程谢谢阅读//定义插入到数据库。jbpmContext.close();}}publicvoidprocessInstanceIsCreatedWhenUserSubmitsWebappForm(){感谢阅读//本方法中的代码可以被放在struts的actiong中,或JSF管理精品文档放心下载//的bean中。//查找在上面所配置的pojo持久化上下文创建器。感谢阅读JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();感谢阅读try{GraphSessiongraphSession=jbpmContext.getGraphSession();谢谢阅读ProcessDefinitionprocessDefinition=感谢阅读graphSession.findLatestProcessDefinition("helloworld");谢谢阅读//使用从数据库中获取的流程定义可以创建一个流程定义的执行精品文档放心下载//就象在helloworld例子中那样(该例没有持久化)。感谢阅读ProcessInstanceprocessInstance=精品文档放心下载newProcessInstance(processDefinition);感谢阅读Tokentoken=processInstance.getRootToken();谢谢阅读assertEquals("start",token.getNode().getName());感谢阅读//让我们起动流程执行token.signal();//现在流程在状态's'。assertEquals("s",token.getNode().getName());感谢阅读//现在流程实例processInstance被存储到数据库,谢谢阅读//因此流程执行的当前状态也被存储到数据库。jbpmContext.save(processInstance);谢谢阅读//以后我们可以从数据库再取回流程实例,并且通过提供另外一个谢谢阅读//信号来恢复流程执行。}finally{//关闭pojo持久化上下文。jbpmContext.close();}}publicvoidtheProcessInstanceContinuesWhenAnAsyncMessageIsReceived()谢谢阅读{//本方法中的代码可以作为消息驱动bean的内容。感谢阅读//查找在上面所配置的pojo持久化上下文创建器。谢谢阅读JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();谢谢阅读try{GraphSessiongraphSession=jbpmContext.getGraphSession();感谢阅读//首先,我们需要从数据库中取回流程实例。//有几个可选方法来分辨出我们在这里所要处理的流程实例。谢谢阅读//在这个简单的测试中,最容易的方式是查找整个流程实例列表,谢谢阅读//这里它应该只会给我们一个结果。//首先,让我们查找流程定义。ProcessDefinitionprocessDefinition=谢谢阅读graphSession.findLatestProcessDefinition("helloworld");精品文档放心下载//现在我们搜索这个流程定义的所有流程实例。ListprocessInstances=graphSession.findProcessInstances(processDefinition.getId()感谢阅读);//因为我们知道在这个单元测试中只有一个执行。//在实际情况中,可以从所到达的信息内容中提取processInstanceId感谢阅读//或者由用户来做选择。ProcessInstanceprocessInstance=谢谢阅读(ProcessInstance)processInstances.get(0);精品文档放心下载//现在我们可以继续执行。注意:processInstance将委托信号感谢阅读//到主执行路径(=根令牌)。processInstance.signal();//在这个信号之后,我们知道流程执行应该到达了结束状态。谢谢阅读assertTrue(processInstance.hasEnded());谢谢阅读//现在我们可以更新数据库中的执行状态。jbpmContext.save(processInstance);精品文档放心下载}finally{//关闭pojo持久化上下文。jbpmContext.close();}}}1.3上下文示例:流程变量流程变量包含了流程执行期间的上下文信息,流程变量与一个java.util.Map相似,它影感谢阅读java感谢阅读在这里的例子中我们只是展示使用变量的API,而没有持久化。感谢阅读有关变量的更多信息可以在“第10章上下文”中找到。谢谢阅读//这个例子仍然从helloworld流程开始,甚至没有修改。谢谢阅读ProcessDefinitionprocessDefinition=谢谢阅读ProcessDefinition.parseXmlString(感谢阅读"<process-definition>"+"<start-state>"+"<transitionto='s'/>"+感谢阅读"</start-state>"+"<statename='s'>"+"<transitionto='end'/>"+谢谢阅读"</state>"+"<end-statename='end'/>"+感谢阅读"</process-definition>");ProcessInstanceprocessInstance=精品文档放心下载newProcessInstance(processDefinition);精品文档放心下载//从流程实例获取上下文实例,用来使用流程变量。ContextInstancecontextInstance=感谢阅读processInstance.getContextInstance();谢谢阅读//在流程离开开始状态之前,我们要在流程实例的上下文中精品文档放心下载//设置一些流程变量。contextInstance.setVariable("amount",newInteger(500));谢谢阅读contextInstance.setVariable("reason","imetmydeadline");谢谢阅读//从现在开始,这些流程变量与流程实例相关联。现在展示由用户代码通过感谢阅读//API访问流程变量,另外,这些代码也可以存在于动作或节点的实现中。精品文档放心下载//流程变量被作为流程实例的一部分也被存储到数据库中。谢谢阅读processInstance.signal();//通过contextInstance访问流程变量。感谢阅读assertEquals(newInteger(500),谢谢阅读contextInstance.getVariable("amount"));感谢阅读assertEquals("imetmydeadline",精品文档放心下载contextInstance.getVariable("reason"));精品文档放心下载1.4任务分配示例jBPM工作流引擎与组织模型是谢谢阅读独立的,所以任何一种用来计算参与者的表达式语言都是有限制的,因此,你不得不指定一个谢谢阅读AssignmentHandler实现,用来包含任务参与者的计算。感谢阅读publicvoidtestTaskAssignment(){谢谢阅读//下面的流程基于helloworld流程。状态节点被一个task-node节点谢谢阅读//所替换。task-nodeJPDL中的一类节点,它表示一个等待状态并且产生谢谢阅读//将要完成的任务,这些任务在流程继续之前被执行。精品文档放心下载ProcessDefinitionprocessDefinition=精品文档放心下载ProcessDefinition.parseXmlString(感谢阅读"<process-definitionname='thebabyprocess'>"+感谢阅读"<start-state>"+"<transitionname='babycries'to='t'/>"+谢谢阅读"</start-state>"+"<task-nodename='t'>"+"<taskname='changenappy'>"+精品文档放心下载"<assignmentclass='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler'/>"+谢谢阅读"</task>"+"<transitionto='end'/>"+感谢阅读"</task-node>"+"<end-statename='end'/>"+精品文档放心下载"</process-definition>");//创建一个流程定义的执行。ProcessInstanceprocessInstance=感谢阅读newProcessInstance(processDefinition);谢谢阅读Tokentoken=processInstance.getRootToken();感谢阅读//让我们起动流程执行,通过默认转换离开开始状态token.signal();//signal方法将会把流程阻塞在一个等待状态,精品文档放心下载//在这里,就是阻塞在task-node。assertSame(processDefinition.getNode("t"),token.getNode());谢谢阅读//当执行到达task-node,一个'changenappy'任务被创建,并且谢谢阅读//NappyAssignmentHandler被调用,来决定任务将要分配给谁。谢谢阅读//NappyAssignmentHandler返回'papa'。谢谢阅读//在一个实际环境中,将使用org.jbpm.db.TaskMgmtSession中的方法精品文档放心下载//从数据库获取任务。因为我们不想在这个例子中包含复杂的持久化,谢谢阅读//所以我们仅使用这个流程实例的第一个任务实例(我们知道,在这个谢谢阅读//测试情景,只有一个任务)。TaskInstancetaskInstance=(TaskInstance)谢谢阅读processInstance.getTaskMgmtInstance().getTaskInstances().iterator().next();//现在我们检查taskInstance是否真正的分配给了'papa'。精品文档放心下载assertEquals("papa",taskInstance.getActorId());精品文档放心下载//现在我们假设'papa'已经完成了他的职责,并且标示任务为已完成。精品文档放心下载taskInstance.end();//因为这是要做的最后一个任务(也是唯一一个),所以任务的完成感谢阅读//会触发流程实例的继续执行。assertSame(processDefinition.getNode("end"),token.getNode());精品文档放心下载}1.5定制动作示例动作是一种绑定你自己的定制代码到jBPM谢谢阅读感谢阅读精品文档放心下载行触发事件时,它们会被执行。MyActionHandler,这个动作处理实现感谢阅读实际上没有做任何事…仅仅是设置布尔变量isExecuted为true。变量isExecuted是一个静态感谢阅读精品文档放心下载证它的值。有关动作的更多信息可以在“9.5动作”中找到。//MyActionHandler是一个在jBPM流程执行期间可以执行用户代码的类。感谢阅读publicclassMyActionHandlerimplementsActionHandler{精品文档放心下载//在每个测试之前(在setUp方法中),isExecuted成员被设置为false。精品文档放心下载publicstaticbooleanisExecuted=false;精品文档放心下载//动作将设置isExecuted为true,当动作被执行之后,单元测试会感谢阅读//展示。publicvoidexecute(ExecutionContextexecutionContext){谢谢阅读isExecuted=true;}}MyActionHandler.isExecuted感谢阅读为false。//每个测试都将以设置MyActionHandler的静态成员isExecuted精品文档放心下载//为false开始。publicvoidsetUp(){MyActionHandler.isExecuted=false;感谢阅读}我们将会在转换上开始一个动作。publicvoidtestTransitionAction(){精品文档放心下载//下面的流程与helloworld流程不同。我们在从状态“s”到精品文档放心下载//结束状态的转换上增加了一个动作。这个测试的目的就是展示感谢阅读//集成java代码到一个jBPM流程是多么的容易。精品文档放心下载ProcessDefinitionprocessDefinition=精品文档放心下载ProcessDefinition.parseXmlString(谢谢阅读"<process-definition>"+"<start-state>"+"<transitionto='s'/>"+精品文档放心下载"</start-state>"+"<statename='s'>"+"<transitionto='end'>"+感谢阅读"<actionclass='org.jbpm.tutorial.action.MyActionHandler'感谢阅读/>"+"</transition>"+"</state>"+"<end-statename='end'/>"+感谢阅读"</process-definition>");//让我们为流程定义起动一个新的执行。ProcessInstanceprocessInstance=感谢阅读newProcessInstance(processDefinition);感谢阅读//下面的信号会导致执行离开开始状态,进入状态“s”。谢谢阅读processInstance.signal();//这里我们展示MyActionHandler还没有被执行。谢谢阅读assertFalse(MyActionHandler.isExecuted);精品文档放心下载//...并且执行的主路径被定位在状态“s”。assertSame(processDefinition.getNode("s"),谢谢阅读processInstance.getRootToken().getNode());谢谢阅读//下面的信号将触发根令牌的执行,令牌将会执行带有动作的转换,精品文档放心下载//并且在调用signal方法期间动作经会被执行token。谢谢阅读processInstance.signal();//我们可以看到MyActionHandler在调用signal方法期间被执行了。谢谢阅读assertTrue(MyActionHandler.isExecuted);精品文档放心下载}下一个例子展示了相同的动作,但是现在动作分别被放置在了enter-node和leave-node感谢阅读谢谢阅读应该放入一个event元素中。ProcessDefinitionprocessDefinition=精品文档放心下载ProcessDefinition.parseXmlString(谢谢阅读"<process-definition>"+"<start-state>"+"<transitionto='s'/>"+谢谢阅读"</start-state>"+"<statename='s'>"+"<eventtype='node-enter'>"+感谢阅读"<actionclass='org.jbpm.tutorial.action.MyActionHandler'/>"精品文档放心下载+"</event>"+"<eventtype='node-leave'>"+精品文档放心下载"<actionclass='org.jbpm.tutorial.action.MyActionHandler'/>"精品文档放心下载+"</event>"+"<transitionto='end'/>"+感谢阅读"</state>"+"<end-statename='end'/>"+精品文档放心下载"</process-definition>");ProcessInstanceprocessInstance=感谢阅读newProcessInstance(processDefinition);谢谢阅读assertFalse(MyActionHandler.isExecuted);谢谢阅读//下面的信号会导致执行离开开始状态,进入状态“s”,感谢阅读//因此状态's'被进入,动作被执行。processInstance.signal();assertTrue(MyActionHandler.isExecuted);谢谢阅读//我们重新设置MyActionHandler.isExecuted。精品文档放心下载MyActionHandler.isExecuted=false;谢谢阅读//下一个信号将会触发执行离开状态's',因此动作将被执行。谢谢阅读processInstance.signal();//请看assertTrue(MyActionHandler.isExecuted);感谢阅读第5章部署jBPM是一个嵌入式BPM引擎,这意味着你可以象安装一个独立的软件产品并集成一样把精品文档放心下载jBPM嵌入到你自己的javajbpm感谢阅读库及其依赖。5.1Java运行环境jBPM3要求J2SE1.4.2+5.2jBPM库jbpm-[version].jar是核心功能库。jbpm-identity-[version].jar是包含在“11.11身份组件”中描述的身份组件的库(可谢谢阅读选的)。5.3第三方库commons-logging和dom4j库到你的classpath,谢谢阅读就可以使用jBPM创建和运行流程,但是这样不支持流程的持久化。如果你不使用流程的xml解感谢阅读析,可以移除dom4j库,改为编程创建对象图。表格5.1库用途描述目录commons-logging.jar在jBPM和jBPM代码日志记录到lib/jboss(感谢阅读hibernate中commonslogging,从感谢阅读记录日至。commonslogging库可jboss4.0.3)谢谢阅读以被配置为分发日志到java1.4日志、log4j、…等等,有关怎样配置commonslogging的更多信息请看apachecommons用户指南。如果你使用log4j,最简单的方式就是把log4j库和一个perties放置到classpath,commonslogging将会自动检测并使用该配置。Dom4j-1.6.1.jar流程定义和Xml解析。lib/dom4j感谢阅读hibernate持久化。jBPM的典型部署中将包括流程定义和流程执行的持久化,在这种情况下,jBPM除了对感谢阅读hibernate及其所依赖库之外不再有任何其他依赖。感谢阅读当然,hibernatehibernate精品文档放心下载文档。下表给出了一个普通POJO部署环境下的指示。精品文档放心下载jBPM的发布使用hibernate3.1,但是它也可以使用3.0.x,如果那样的话,你不得不在精品文档放心下载hibernate.queries.hbm.xml配置文件中更新一些hibernate谢谢阅读请看“7.6自定义查询”。表格5.2库用途描述目录hibernate3.jarhibernat最好的lib/hibernate(hibernate3感谢阅读e持久化。O/R映射.1)器。antlr-2.7.5H3.jar由解析库。lib/jboss(从jboss4.0.3)精品文档放心下载hibernate持久化的查询分析使用。cglib-2.1_2jboss.jarhibernathibernatlib/jboss(从jboss4.0.3)感谢阅读e持久化。e代理所使用的反射库。Commons-collection.jahibernatlib/jboss(从jboss4.0.3)精品文档放心下载re持久化。ehcache-1.1.jarhibernat二级缓存lib/hibernate谢谢阅读e持久化实现,当(默认配为置)。hibernate配置不同的的缓存时,不需要本库。jaxen-1.1-beta-4.jar流程定义XPath库lib/hibernate谢谢阅读和(由hiberantdom4j使e持久化。用)。jdbc2_0-stdext.jarhibernatlib/hibernate精品文档放心下载e持久化。asm.jarhibernatasm字节lib/hibernate精品文档放心下载e持久化。码库。asm-attrs.jarhibernatasm字节lib/hibernate感谢阅读e持久化。码库。beanshellbeanshell集成到jbpm流程语言中感谢阅读使用,并且你将会得到一个日志信息说“jbpm不能加载Script类,因此script元素不能使感谢阅读用”。表格5.3库用途描述目录bsh-.jbeanshell脚本解只用在script和decisionlib/jboss精品文档放心下载ar释程序。元素中,当你不使用这些流程元素时,可以移除beanshell库,但是必须在hibernate.cfg.xml文件中注释掉Sceipt.hbm.xml映射行。第6章配置jBPM配置由java类org.jbpm.JbpmConfigurationJbpmConfiguration的最精品文档放心下载简单方式是使用单态实例方法JbpmConfiguration.getInstance()。精品文档放心下载如果你想从另外一个源加载配置,你可以使用JbpmConfiguration.parseXxxx方法。精品文档放心下载staticJbpmConfingurationjbpmConfiguration=感谢阅读JbpmConfinguration.getInstance();感谢阅读JbpmConfiguration是线程安全的,因此可以在一个静态成员中维护,所有的线程都可以感谢阅读把JbpmConfiguration作为一个JbpmContext对象的工厂来使用。JbpmContext表示一个事务,谢谢阅读在一个上下文块中JbpmContext使服务可用,上下文块如下:感谢阅读JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();谢谢阅读try{//Thisiswhatwecallacontextblock.感谢阅读//Hereyoucanperformworkflowoperations谢谢阅读}finally{jbpmContext.close();}JbpmContext使一组服务和配置为jBPM可用,这些服务在jbpm.cfg.xml配置文件中被配精品文档放心下载置,并且使jBPM无论运行在任何java环境中这些服务都可用。感谢阅读下面是JbpmContext的一个典型配置,就象你在src/config.files/jbpm.cfg.xml中看到感谢阅读的那样:<jbpm-configuration><jbpm-context><servicename='persistence'精品文档放心下载factory='org.jbpm.persistence.db.DbPersistenceServiceFactory'/>精品文档放心下载<servicename='message'factory='org.jbpm.msg.db.DbMessageServiceFactory'/>精品文档放心下载<servicename='scheduler'factory='org.jbpm.scheduler.db.DbSchedulerServiceFactory'/>精品文档放心下载<servicename='logging'factory='org.jbpm.logging.db.DbLoggingServiceFactory'/>精品文档放心下载<servicename='authentication'感谢阅读factory='org.jbpm.security.authentication.DefaultAuthenticationServic精品文档放心下载eFactory'/></jbpm-context><!--configurationresourcefilespointingtodefaultconfiguration精品文档放心下载filesinjbpm-{version}.jar-->谢谢阅读<stringname='resource.hibernate.cfg.xml'value='hibernate.cfg.xml'精品文档放心下载/><!--<stringname='perties'谢谢阅读value='perties'/>-->精品文档放心下载<stringname='resource.business.calendar'感谢阅读value='org/jbpm/calendar/perties'/>感谢阅读<stringname='resource.default.modules'感谢阅读value='org/jbpm/graph/def/perties'/>精品文档放心下载<stringname='resource.converter'谢谢阅读value='org/jbpm/db/hibernate/perties'/>谢谢阅读<stringname='resource.action.types'精品文档放心下载value='org/jbpm/graph/action/action.types.xml'/>精品文档放心下载<stringname='resource.node.types'谢谢阅读value='org/jbpm/graph/node/node.types.xml'/>精品文档放心下载<stringname='resource.parsers'精品文档放心下载value='org/jbpm/jpdl/par/jbpm.parsers.xml'/>精品文档放心下载<stringname='resource.varmapping'精品文档放心下载value='org/jbpm/context/exe/jbpm.varmapping.xml'/>谢谢阅读<intname='jbpm.byte.block.size'value="1024"singleton="true"/>谢谢阅读<beanname='jbpm.task.instance.factory'谢谢阅读class='org.jbpm.taskmgmt.impl.DefaultTaskInstanceFactoryImpl'感谢阅读singleton='true'/><beanname='jbpm.variable.resolver'精品文档放心下载class='org.jbpm.jpdl.el.impl.JbpmVariableResolver'singleton='true'谢谢阅读/><longname='jbpm.msg.wait.timout'value='5000'singleton='true'/>精品文档放心下载</jbpm-configuration>在这个配置中你可以看到三部分:l第一部分使用一组服务实现配置jbpm谢谢阅读章节中做了描述。l第二部分是所有配置资源的引用映射,如果你想要定制某些配置文件,这些资源引用可以被谢谢阅读修改。典型情况下,你可以在jbpm-3.x.jar中拷贝一个默认的配置,并且把它放在classpath谢谢阅读中的某个位置,然后在这个文件中修改引用为你自己定制版本的配置文件。感谢阅读l第三部分是在jbpm谢谢阅读缺省配置的一组服务被定位于一个简单的web应用环境和最小的依赖,持久化服务将获得谢谢阅读一个jdbc连接,所有其他服务将会使用这个相同的连接来完成它们的服务,因此,工作流的所谢谢阅读有操作都被集中到一个JDBC连接的一个事务中,不再需要事务管理器。精品文档放心下载JbpmContext包含为大多流程操作所提供的方便方法:谢谢阅读publicvoiddeployProcessDefinition(ProcessDefinition精品文档放心下载processDefinition){...}publicListgetTaskList(){...}谢谢阅读publicListgetTaskList(StringactorId){...}精品文档放心下载publicListgetGroupTaskList(ListactorIds){...}谢谢阅读publicTaskInstanceloadTaskInstance(longtaskInstanceId){...}感谢阅读publicTaskInstanceloadTaskInstanceForUpdate(longtaskInstanceId)精品文档放心下载{...}publicTokenloadToken(longtokenId){...}精品文档放心下载publicTokenloadTokenForUpdate(longtokenId){...}谢谢阅读publicProcessInstanceloadProcessInstance(longprocessInstanceId)感谢阅读{...}publicProcessInstanceloadProcessInstanceForUpdate(long精品文档放心下载processInstanceId){...}publicProcessInstancenewProcessInstance(String精品文档放心下载processDefinitionName){...}精品文档放心下载publicvoidsave(ProcessInstanceprocessInstance){...}精品文档放心下载publicvoidsave(Tokentoken){...}感谢阅读publicvoidsave(TaskInstancetaskInstance){...}精品文档放心下载publicvoidsetRollbackOnly(){...}谢谢阅读记住,XxxForUpdate方法将记录所加载的对象为自动保存的,因此不需要再调用save方精品文档放心下载法。指定多个jbpmjbpm上下文的name属性必须是唯一谢谢阅读的,可以使用JbpmConfiguration.createContext(Stringname)获取命名的上下文。谢谢阅读service元素定义了一个服务名称和此服务的服务工厂,服务将只会在使用感谢阅读JbpmContext.getServices().getService(Stringname)请求时被创建。感谢阅读工厂也可以被作为一个元素来指定,而不是用属性。那样可以用于在工厂对象中注入一些感谢阅读配置信息,负责解析XML的组件创建和装配被调用的对象工厂。精品文档放心下载6.1配置属性jbpm.byte.block.sizeblob,而是作谢谢阅读jBPM的全面嵌入能力,感谢阅读这个参数控制了固定长度块的大小。jbpm.task.instance.factory感谢阅读当你想要定制TaskInstancebean并且向它添加新的属性时,这是有必要的。请参考“11.10精品文档放心下载定制任务实例”,指定的类必须实现org.jbpm.tskmgmt.TaskInstanceFactory。感谢阅读jbpm.variable.resolver:定制jBPM在JSF表达式中寻找第一个术语的方式。精品文档放心下载jbpm.msg.wait.timout:定制消息缓存的时间。感谢阅读6.2配置文件下面是对在jBPM中定义的所有配置文件的简短描述。精品文档放心下载6.2.1Hibernate.cfg.xml文件这个文件包含hibernate配置,并且引用hibernate映射资源文件。精品文档放心下载位置:hibernate.cfg.xml文件如果不另外在perties文件的谢谢阅读jbpm.hibernate.cfg.xml属性中指定,则jBPM工程中的默认hibernate配置文件在目录精品文档放心下载src/config.files/hibernate.cfg.xml。精品文档放心下载6.2.2Hibernate查询配置文件这个文件包含jBPM会话org.jbpm.db.*Session中所使用的hibernate查询。感谢阅读位置:org/jbpm/db/hibernate.queries.hbm.xml。精品文档放心下载6.2.3节点类型配置文件这个文件包含了XML节点元素到节点实现类的映射。位置:org/jbpm/graph/node/node.types.xml。感谢阅读6.2.4动作类型配置文件这个文件包含了XML动作元素到动作实现类的映射。位置:org/jbpm/graph/action/action.types.xml。精品文档放心下载6.2.5业务日历配置文件包含了业务时间和空闲时间的定义。位置:org/jbpm/calendar/perties。感谢阅读6.2.6变量映射配置文件指定了流程变量(java对象)的值怎样转换到用于存储到jbpm数据库中的变量实例。谢谢阅读位置:org/jbpm/context/exe/jbpm.varmapping.xml。感谢阅读6.2.7转换器配置文件指定了id到类名的映射。id被存储到数据库,org.jbpm.db.hibernate.ConverterEnumType感谢阅读被用来映射id到单态对象。位置:org/jbpm/db/hibernate/perties。感谢阅读6.2.8缺省模块配置文件指定哪个模块被缺省添加到一个新的流程定义ProcessDefinition。谢谢阅读位置:org/jbpm/graph/def/perties。感谢阅读6.2.9流程档案解析器配置文件指定流程档案解析的解析器。位置:org/jbpm/jpdl/par/jbpm.parsers.xml。谢谢阅读6.3对象工厂对象工厂可以依照bean的xml精品文档放心下载置以及组装到一起形成一个完整的对象图。对象工厂可以注入配置和其他bean到一个bean中。精品文档放心下载在最简单的形式中,对象工厂可以从这样一个配置中创建基本类型和javabean:精品文档放心下载<beans><beanname="task"class="org.jbpm.taskmgmt.exe.TaskInstance"/>谢谢阅读<stringname="greeting">helloworld</string>感谢阅读<intname="answer">42</int>感谢阅读<booleanname="javaisold">true</boolean>感谢阅读<floatname="percentage">10.2</float>精品文档放心下载<doublename="salary">100000000.32</double>精品文档放心下载<charname="java">j</char>精品文档放心下载<nullname="dusttodust"/>精品文档放心下载</beans>---------------------------------------------------------谢谢阅读ObjectFactoryof=ObjectFactory.parseXmlFromAbove();谢谢阅读assertEquals(TaskInstance.class,of.getNewObject("task").getClass());精品文档放心下载assertEquals("helloworld",of.getNewObject("greeting"));精品文档放心下载assertEquals(newInteger(42),of.getNewObject("answer"));谢谢阅读assertEquals(Boolean.TRUE,of.getNewObject("javaisold"));谢谢阅读assertEquals(newFloat(10.2),of.getNewObject("percentage"));谢谢阅读assertEquals(newDouble(100000000.32),of.getNewObject("salary"));谢谢阅读assertEquals(newCharacter('j'),of.getNewObject("java"));谢谢阅读assertNull(of.getNewObject("dusttodust"));谢谢阅读你也可以配置列表:<beans><listname="numbers"><string>one</string><string>two</string><string>three</string></list></beans>以及map:<beans><mapname="numbers"><entry><key><int>1</int></key><value><string>one</string></value>精品文档放心下载</entry><entry><key><int>2</int></key><value><string>two</string></value><谢谢阅读/entry><entry><key><int>3</int></key><value><string>three</string></valu感谢阅读e></entry></map></beans>Bean可以使用直接成员注入和通过属性的setter。谢谢阅读<beans><beanname="task"class="org.jbpm.taskmgmt.exe.TaskInstance">精品文档放心下载<fieldname="name"><string>dodishes</string></field>感谢阅读<propertyname="actorId"><string>theotherguy</string></property>谢谢阅读</bean></beans>Beanbean精品文档放心下载任何对象。<beans><beanname="a"class="org.jbpm.A"/>

<refname="b"bean="a"/>感谢阅读</beans>Bean可以使用任何构造器构造(构造函数)。<beans><beanname="task"class="org.jbpm.taskmgmt.exe.TaskInstance">

<constructor>感谢阅读<parameterclass="java.lang.String">

<string>dodishes</string>谢谢阅读</parameter><parameterclass="java.lang.String">精品文档放心下载<string>theotherguy</string>精品文档放心下载</parameter></constructor></bean></beans>…或者在bean上使用工厂方法…<beans><beanname="taskFactory"class="org.jbpm.UnexistingTaskInstanceFactory"精品文档放心下载singleton="true"/><beanname="task"class="org.jbpm.taskmgmt.exe.TaskInstance">精品文档放心下载<constructorfactory="taskFactory"method="createTask">感谢阅读<parameterclass="java.lang.String">精品文档放心下载<string>dodishes</string>感谢阅读</parameter><parameterclass="java.lang.String">精品文档放心下载<string>theotherguy</string>谢谢阅读</parameter></constructor></bean></beans>…或者在类上使用一个静态工厂方法…<beans><beanname="task"class="org.jbpm.taskmgmt.exe.TaskInstance">感谢阅读<constructorfactory-class="org.jbpm.UnexistingTaskInstanceFactory"谢谢阅读method="createTask"><parameterclass="java.lang.String">精品文档放心下载<string>dodishes</string>感谢阅读</parameter><parameterclass="java.lang.String">谢谢阅读<string>theotherguy</string>感谢阅读</parameter></constructor></bean></beans>每个命名的对象都可以使用属性感谢阅读厂为每个请求将总是返回相同的对象。注意,单态不能在不同对象工厂之间共享。精品文档放心下载单态特性导致getObject和getNewObject方法间的区别,对象工厂谢谢阅读的典型用户将使用getNewObject,这意味着在一个新的对象图被构精品文档放心下载精品文档放心下载精品文档放心下载谢谢阅读对象缓存在每个getNewObject方法被调用起始会被清除。第7精品文档放心下载章持久化Jbpm需要维护跨越长时间的流程的执行,在这里,“长时间意味着跨越感谢阅读精品文档放心下载一个状态转到下一个状态,所以持久化的主要目的就是在等待状态存储流程的执行。感谢阅读一个流程定义可以表现为三种不同形式:XML、Java对象、Jbpm数据库中记录。执行(运精品文档放心下载行时)信息和日志信息可以表现为两种形式:Java对象和Jbpm数据库中的记录。精品文档放心下载图7.1转换和不同形式有关XML表示流程定义以及流程档案的更多信息,请参考“第16章Jbpm流程定义语言谢谢阅读(JPDL)”。关于怎样部署流程档案到数据库在“第16.1.1节部署流程档案”中可以找到。精品文档放心下载7.1持久化API7.1.1相关配置框架持久化APIJbpmContextAPI精品文档放心下载要像下面这样在JbpmContext块中使用:JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();感谢阅读try{//Invokepersistenceoperationshere感谢阅读}finally{jbpmContext.close();}在下文中,我们假设配置中包含如下持久化服务(如示例配置文件谢谢阅读src/config.files/jbpm.cfg.xml):精品文档放心下载<jbpm-configuration><jbpm-context><servicename='persistence'精品文档放心下载factory='org.jbpm.persistence.db.DbPersistenceServiceFactory'/>精品文档放心下载...</jbpm-context>...</jbpm-configuration>7.1.2JbpmContext中的便利方法三个普通的持久化操作是:l部署流程l启动一个流程的执行l继续一个执行首先部署一个流程定义。典型的,这可以从图形化流程设计器或部署流程的Ant任务直接谢谢阅读完成,但是在这里你会看到怎样通过编程实现:JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();感谢阅读try{ProcessDefinitionprocessDefinition=...;感谢阅读jbpmContext.deployProcessDefinition(processDefinition);谢谢阅读}finally{jbpmContext.close();}要创建一个新的流程执行,我们需要指定一个要实例化执行的流程定义,通常的作法是指谢谢阅读定一个流程名称,并让Jbpm在数据库中查找这个流程的最新版本:谢谢阅读JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();谢谢阅读try{StringprocessName=...;ProcessInstanceprocessInstance=感谢阅读jbpmContext.newProcessInstance(processName);精品文档放心下载}finally{jbpmContext.close();}要继续一个流程执行,我们需要从数据库中取出这个流程实例、令牌或者任务实例,在这谢谢阅读些POJOJbpm对象上调用一些方法,然后再把对流程实例的更新保存到数据库中。精品文档放心下载JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();感谢阅读try{longprocessInstanceId=...;感谢阅读ProcessInstanceprocessInstance=谢谢阅读jbpmContext.loadProcessInstance(processInstanceId);精品文档放心下载processInstance.signal();jbpmContext.save(processInstance);谢谢阅读}finally{jbpmContext.close();}注意:如果你在JbpmContext中使用xxxForUpdate方法,则jbpmContext.save不需要再

显式的调用,因为在jbpmContext关闭时它会被自动调用。举例来说,假设我们要通知Jbpm一

一个非常方便的方法是使用loadTaskInstanceForUpdate方法:精品文档放心下载JbpmContextjbpmContext=jbpmConfiguration.createJbpmContext();感谢阅读try{longtaskInstanceId=...;感谢阅读TaskInstancetaskInstance=精品文档放心下载jbpmContext.loadTaskInstanceForUpdate(taskInstanceId);感谢阅读taskInstance.end();}finally{jbpmContext.close();}正象是后台信息一样,下面部分解释了Jbpm是怎样管理持久化和使用Hibernate的。精品文档放心下载JbpmConfiguration维护了一组服务工厂(ServiceFactory),服务工厂象前面内容所说精品文档放心下载的在jbpm.cfg.xml中配置,并且是lazy(懒)实例化的。当在第一次需要谢谢阅读DbpersistenceServiceFactoryJbpmConfiguration中维护,感谢阅读DbpersistenceServiceFactory管理一个hibernateSessionFactory,而hibernate精品文档放心下载SessionFactory也是在第一次被请求的时候才创建的。谢谢阅读图7.2持久化相关类在调用jbpmConfiguration.createJbpmContext()方法期间,只有JbpmContext被创建,精品文档放心下载这时没有更多的持久化相关实例。JbpmContext管理一个DbPersistenceService感谢阅读请求的时候实例化。DbPersistenceServece管理hibernate会话(session),hibernate会话在精品文档放心下载DbPersistenceServece中也是被Lazy(懒)创建的,因此结果是:一个hibernate会话只有在感谢阅读第一个请求持久化的操作被调用时才被打开,而在这之前不会。精品文档放心下载7.1.3高级API用法DbPersistenceService维护了一个懒实例化的hibernate精品文档放心下载过这个hibernateJbpm暴露出的xxxSession类完成的,精品文档放心下载例如GraphSession、SchedulerSession、LoggingSession等等,这些session类都是提交感谢阅读hibernate查询并且都使用下层相同的hebernate会话。精品文档放心下载XxxxSession类也是通过JbpmContext来获取的。感谢阅读7.2配置持久化服务7.2.1Thehibernatesessionfactory感谢阅读默认情况下,DbpersistenceServiceFactory将使用classpath根下的资源文件感谢阅读hibernate.cfg.xml来创建hibernate会话工厂。注意:hibernate资源配置文件由感谢阅读“jbpm.hibernate.cfg.xml”属性指定,可以在jbpm.cfg.xml中定制。下面是默认配置:谢谢阅读<jbpm-configuration>...<!--configurationresourcefilespointingtodefaultconfiguration谢谢阅读filesinjbpm-{version}.jar-->谢谢阅读<stringname='resource.hibernate.cfg.xml'谢谢阅读value='hibernate.cfg.xml'/>精品文档放心下载<!--<stringname='perties'感谢阅读value='perties'/>-->谢谢阅读...</jbpm-configuration>当属性感谢阅读hibernate.cfg.xml中的配置,因此我们可以使用perties文件、而不是更新谢谢阅读hibernate.c

温馨提示

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

评论

0/150

提交评论