工作流开发指南.doc





《工作流开发指南.doc》由会员分享,可在线阅读,更多相关《工作流开发指南.doc(76页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流工作流开发指南.精品文档.JBPM开发指南2007年7月目录一、概述4二、第一个流程52.1、开始前的准备52.2 、Hello World 例子6三、学习JPDL113.1 、简介113.2 、流程版本(Version)113.3 、流程定义123.3.1 process-definition(流程定义)123.3.2 node(自动节点)133.3.3 start-state(开始状态)133.3.4 end-state(结束节点)143.3.5 state(状态)143.3.6 task-node (任务节点)153.3.7 fork(
2、分支)163.3.8 join(联合)173.3.9 decision(决策)183.3.10 transition(转换)193.3.11 event(事件)203.3.12 action(动作)203.3.13 script(脚本)223.3.14 expression(表达式)233.3.15 variable(变量)233.3.16 handler(句柄)233.3.17 timer(定时器)243.3.18 create-timer(创建定时器)253.3.19 cancel-timer(取消定时器)263.3.20 task(任务)263.3.21 swimlane(泳道)273.
3、3.22 assignment(委派)283.3.23 controller(控制器)293.3.24 process-state 子流程293.3.25 sub-process 子流程303.3.26 condition 条件303.3.27 exception-handler 异常处理31小结33四、流程中任务的分配374.1 assignment-handler方式的任务分配384.2 swimlane方式的任务分配39五、JBPM持久化425.1 特殊数据库支持425.2 JBPM数据库的安装425.2 JBPM流程发布455.2.1 搭建JBPM的WEB应用465.2.2 发布第一个
4、流程48六、日历(Scheduler)546.1 Scheduler在C/S程序上的应用546.2 Scheduler 在Web上的应用576.3 Scheduler时间的分类60七、异步执行63八、JBPM流程建模与应用648.1 JBPM的建模工具648.1.1 建模工具的安装648.2 公司报销流程示例678.2.1 流程建模678.2.2 流程数据库搭建768.2.3 构建业务表798.2.4 搭建工程828.2.5 报销流程的发布838.2.6 应用程序搭建84九、写在最后100一、概述JBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,
5、理论上说,只要Hibernate支持的数据库JBPM都支持。同时它还能被部署在任何一款JAVA应用服务器上。二、第一个流程2.1、开始前的准备JBPM的工程文件,大家可以到如下网站上去下载: 目前的最新版本是3.2.1,本文就以此版本为例。在这里请大家下载jbpm-starters-kit-3.1.2这样一个版本。在这个版本里包括一个JBPM流程设计器的Eclipse插件,和一个用JBOSS作为服务器的示例流程等相关文件。解压jbpm-starters-kit-3.1.2.rar到某个特定目录,这里我们首先用到的是包里的JBPM目录下的文件。JBPM目录里面是JBPM的Eclipse的工程文件
6、,我们可以用Eclipse导入该工程。从Eclipse的File菜单里选择import Existing Projects into Workspacenext根据向导找到前面提到的JBPM目录就可以把该工程导入到Eclipse当中。如下图:好了,接下来,我们就在这个工程的基础之上来开始我们的第一个流程。2.2 、Hello World 例子我们的第一个流程示例源自JBPM的reference。流程图如下:JBPM的流程定义采用XML的方式(实际绝大多数的流程引擎的流程定义都采用的是这种方式),作为测试XML定义我们既可以写在代码当中,也可以以一个独立的XML文件的形式存在,接下来的例子我们将
7、分别为大家介绍一下这两种情况。我们首先来看看把XML流程定义写在代码中的方式。新建一个Junit的测试用例,测试代码如下:package org.jbpm.tutorial.helloworld;import junit.framework.TestCase;import org.jbpm.graph.def.ProcessDefinition;import org.jbpm.graph.exe.ProcessInstance;import org.jbpm.graph.exe.Token;public class HelloWorldTest extends TestCase public
8、void testHelloWorldProcess() /*这个段测试方法演示了一个流程的在代码中以字符串形式定义和这个流程定义的具体执行。 这个流程定义包含三个节点:一个未命名的开始状态(start-state), 一个名字为s的状态(state)和一个名字为end的结束状态(end-state)。 下一行的功能是把一段xml文本解析为一个ProcessDefinition,一个ProcessDefinition是一个java对象的形式对流程的正式的描述。*/ ProcessDefinition processDefinition = ProcessDefinition.parseXmlS
9、tring( + + + + + + + + );/*下边的一行根据流程定义构造了的一个具体的执行实例。 构造以后,执行的流程就有了一个被定位在开始状态(start-state)上的主要的执行路径 */ ProcessInstance processInstance = new ProcessInstance(processDefinition);/*构造以后,执行的流程就有了一个主要的执行路径(root token) */ Token token = processInstance.getRootToken();/*当然,构造以后,流程定义的主要的执行路径被定位在开始状态(start-sta
10、te)*/ assertSame(processDefinition.getStartState(), token.getNode(); /*开始流程执行,通过默认的转换(transition)离开开始状态(start-state)*/ token.signal();/*直到运行的流程进入一个等待状态,signal方法将一直被阻塞,运行的流程将要进入第一个等待状态:状态s.因此现在主要的执行路径,定位到了状态s上。 */ assertSame(processDefinition.getNode(s), token.getNode();/*执行signal,流程将继续执行,将通过默认的转换(tr
11、ansition)离开状态s*/ token.signal();/*流程实例已经到达了结束状态。*/ assertSame(processDefinition.getNode(end), token.getNode(); 运行测试,我们看到流程和我们预想的结果完全符合。在这里我们的流程定义是写在一个代码中,XML的定义方式是以通过拼字符串的方式完成的,这种方式给我们带来的结果是不直观,同时流程定义起来也很不方便。除了这种定义方式之外我们可以把刚才那段写在代码里的流程定义信息搬到我们的XML文件里,同样可以达到相同的效果。接下来我们就来看一下这种做法。流程定义文件:helloWorld.xml测
12、试代码:HelloWorldTest.javapackage org.jbpm.tutorial.helloworld;import junit.framework.TestCase;import org.jbpm.graph.def.ProcessDefinition;import org.jbpm.graph.exe.ProcessInstance;import org.jbpm.graph.exe.Token;public class HelloWorldTest extends TestCase public void testHelloWorldProcess() ProcessDe
13、finition processDefinition = ProcessDefinition.parseXmlResource(helloWorld.xml);/*从这里可以看出,与上面那段代码唯一不同之处就是没有字符串形式的流程定义信息了,取而代之的是对流程定义的XML进行解析*/ ProcessInstance processInstance = new ProcessInstance(processDefinition); Token token = processInstance.getRootToken(); assertSame(processDefinition.getStart
14、State(), token.getNode(); token.signal(); assertSame(processDefinition.getNode(s), token.getNode(); token.signal(); assertSame(processDefinition.getNode(end), token.getNode(); 运行测试,得到的结果同上例完全相同。到这里为止,我们已经做了一个非常简单的流程示例,对JBPM的流程定义及使用方法也有了初步的概念,在下面的内容中我们将着重来讨论JBPM的流程定义方法,及各个节点的主要含义及使用方法。三、学习JPDL3.1 、简介
15、JPDL(JBPM Process Definition Language)是JBPM流程定义语言。JPDL详细定义了这个状态图的每个部分,如: 开始、结束状态,状态之间的转换等。这种语言的定义对于用户来说比较容易理解,也比较容易对其进行扩展。一个JBPM的流程定义XML文件中包含一个元素,而一个元素又包含零个或一个元素,零个或多个的元素,一个元素,零个或多个的元素或元素或元素或元素,以及零个或多个的元素,零个或多个和元素,一个元素等等。此外,元素有一个标示符,以“name”属性来表示,这个属性必须存在,用来表示该流程的名称。3.2 、流程版本(Version)我们的流程XML文件定义完成之后
16、,接下来的工作就是要将其发布到对应的数据库中,当我们每次将我们的流程定义部署到数据库时,部署时流程的名称就是前面提过的里定义的name”属性的值。JBPM的版本机制允许在数据库中多个同名流程定义共存,流程实例以当时的最新版本来启动,并且在它的整个生命周期中将保持以相同的流程定义执行。当一个新的版本被部署,新的流程实例以新版本启动,而老的流程实例则以老的流程定义继续执行。在部署的时候,jbpm 安排一个版本(version)号码(数字)给流程定义。为了实现安排version号码,如果它是第一个版本(version),JBPM采取1+或者1。从ProcessDefinition pd=JbpmCo
17、ntext.getGraphSession().findLatestProcessDefinition(processName)中可以通过一个给定的processName查找最近的流程定义,这里的processName就是前面我们在定义流程的时候在里定义的name”属性的值,这个属性就是用来表示该流程的名称。如我们的下列代码就是要列出JBPM数据库里的有所有最后一次发布的流程定义的版本:JbpmContext context=JbpmContext.getCurrentJbpmContext();List ls=context.getGraphSession().findLatestProce
18、ssDefinitions();/*这里返回的List是ProcessDefinition的集合*/3.3 、流程定义3.3.1 process-definition(流程定义)流程定义的根节点,是所有节点的父节点名称类型数量描述name属性可选的流程的名称。swimlane元素0.*流程中使用的泳道。泳道表示流程角色,它们被用于任务分配。start-state元素0.1流程起始状态。注意,没有起始状态的流程是合法的,但是不能被执行。end-state|state|node|task-node|process-state|super-state|fork|join|decision元素0.*流
19、程定义的节点。注意,没有节点的流程是合法的,但是不能被执行。event元素0.*作为一个容器服务于动作的流程事件。action|script|create-timer|cancel-timer元素0.*全局定义的的动作,可以在事件和转换中引用。注意,为了被引用,这些动作必须指定名称。task元素0.*全局定义的任务,可以在动作中使用。exception-handler元素0.*一个异常处理器列表,用于这个流程定义中的委托类所抛出的所有异常。3.3.2 node(自动节点)这种节点和State相反,也称自动节点。当业务程序实例执行到这个节点,不会停止执行。而是会继续往下执行。如果该节点存在多个离
20、开转向。那么,就会执行其中的第一个离开转向,在Node状态中,不需要外部参与者的参与,业务流程的这个部分是自动的、即时完成的。名称类型数量描述action|script|create-timer|cancel-timer事件1用于表示这个节点行为的定制动作。普通节点元素请参考普通节点元素。3.3.3 start-state(开始状态)start-state是我们整个流程的开始节点,所有的流程实例从这里开始。 名称类型数量描述Name属性可选的节点的名称。Task元素0.1起始一个流程实例的任务,或者用来捕获流程发起者Event元素0.*支持的事件类型:node-leave。transition
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工作流 开发 指南

限制150内