资源预览内容
第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
第9页 / 共24页
第10页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
jBPM-jPDL 学习笔记流程设计与控制作者: 发布日期: 2010-07-13 00:00:00 查看次数:375 次相关资料: jBPM 学习笔记(V3.2 环境部署) jBPM 学习笔记(框架设计简介) 背景 本片文章,我们将从业务流程的设计开始,通过带领大家完成一个完整工作流的程序设计,来学习 jPDL 的使用。 业务流程设计 这里我们实现一个相对简化的公司借款申请流程。流程图如下: 在 jPDL 中,与流程设计相关的文件有三个:processdefinition.xml、gdp.xml、processimage.jpg 。其中 processdefinition.xml 是流程定义的描述文件;gpd.xml 是对图形界面呈现的 XML 描述;而 processimage.jpg 则是对图形界面的快照。下面我们将展示本样例的流程定义文件。 流程定义描述 processdefinition.xml 文件引用 在样例流程中,除了开始和结束结点外,我们定义了三种类型的结点: 任务结点 任务结点是一个需要人工参与的结点类型。当流程进入结点时,会生成相应的任务实例(TaskInstatnce),并通过委派接口 AssignmentHandler 或 jBPM 表达式将任务委派给一个或多个特定的角色或参与者。结点自身进入等待状态,直到任务被参与者完成或者跳过,流程继续。 判定结点 判定结点的设计目标是根据上下文环境和程序逻辑,判定流程转向。通过指定一个实现DecisionHandlder 接口的 Java 委派类或 jBPM 表达式,来返回转向(transition)的字符窜类型的名称(可以是中文哦),来达到决定流程方向的功能。 普通结点 普通结点也可以定义相应的处理任务,通过定义相应的 ActioinHandler 类。同任务结点不同的是,普通结点定义的任务是由流程自动执行的,无须人工干预。 三种结点都可定义结点事件(event ): node-enter,该事件在流程进入结点时触发 node-leave,该事件在流程离开节点是触发 可以在事件上挂接 ActioinHandler 接口的实现类来完成一些特定的功能。 三种节点都可以定义异步处理方式(async 属性): 异步处理意味着每个结点的事务处理是通过消息机制分离的,不再同一线程中统一调用执行。而是由消息监听线程从消息队列中取得消息体来运行相应得程序。 此外我们定义了结点间的转向(transition),用来记录和处理状态的变迁。每个转向中,可以委派一个或多个的 ActioinHandler 接口实现类,负责处理节点变迁时的上下文状态变更及回调用户定义的处理程序。 流程的程序接口说明 动作处理接口(ActioinHandler) 接口方法:void execute( ExecutionContext executionContext ) throws Exception 该接口是 jPDL 中最常用的一个回调接口。从它的接口方法可以发现,它仅仅暴露了流程执行上下文变量 ExecutionContext。用户程序通过 ExecutionContext 来了解流程的执行状态,并通过改变 ExecutionContext 中的属性值来影响流程的执行。 ActioinHandler 接口可以在所有能包含事件(event)、动作(action)元素的地方被回调。 判定处理接口(DecisionHandlder) 接口方法:String decide(ExecutionContext executionContext) throws Exception 判定接口仅适用于判定节点(decision)中。从它的接口方法可以看出,方法要返回一个字符串型的结果,这个结果必须和判定节点拥有的转向(transition)集合中的一条转向名称相匹配。 在 DecisionHandlder 的接口方法中一样能访问到 ExecutionContext 变量,这为判定提供了执行上下文的根据。当然,如果有必要,用户也可以在该接口中改变 ExecutionContext 中的变量值。 委派处理接口(AssignmentHandler) 接口方法:void assign(Assignable assignable, ExecutionContext executionContext) throws Exception; 委派处理接口被用户任务元素(task)的委派(assignment)子元素中,它的职责很明确,就是将任务分配给指定的人员或角色。 在 AssignmentHandler 接口的方法中, Assignable 变量通常指任务实例(TaskInstance)。通过将 ExecutionContext 和 TaskInstance 两个变量都暴露给接口方法,用户就可以根据流程上下文情况,来决定要将指定的任务分配个谁。 流程的部署 用户使用 jPDL 的流程设计器定义业务流程,当然,你也可以直接用文档编辑器直接编辑processdefinition.xml 定义文件。定义文档是可以直接被 ProcessDefinition 类载入使用的,但在正式运行的系统中,流程定义信息更多是使用关系型数据库来存储。从流程定义文件将数据导入流程数据库的过程,我们称之为流程部署。 jPDL 的流程部署文件包含 processdefinition.xml 的定义部分和 Java 处理器的代码部分,这些文件可以被一起打包成.jpdl 的 zip 格式包而后上传服务器端。这个过程可以在流程设计器界面的“deployment”标签页中操作: 这里我们着重要讲述的是接受部署文件上载的服务器端配置。在 jBPM3.2 的包中带着一个jPDL 的管理控制台 web 应用,默认名字为 jbpm-console。该应用带有接受流程定义包部署的程序,但不是最小化的。实际上完成流程部署功能的,只是 jbpm-jpdl.jar 核心包中的一个servlet 类:org.jbpm.web.ProcessUploadServlet . 完成这个 Servlet 的成功部署,需要以下工作: 1. 配置 web.xml,将 servlet 配置成启动时加载,如下: 引用GDP Deployer Servlet org.jbpm.web.ProcessUploadServlet 1 GDP Deployer Servlet /upload/* 2. 建立流程定义存储数据库表: Demo 中,我们使用的数据库是 MySQL 的,在 E:Javatoolsjbpm-jpdl-3.2.2db目录下有个 jbpm.jpdl.mysql.sql 数据库脚本文件。但我们不能直接导入该文件 , 会提示有错误, 应为该文件的 SQL 语句末尾少了分号,在批量执行时, MySQL 报错。需要在每一行 SQL 的末尾添加一个分号,这样就可以用 source 命令导入了。 3. 配置 Hibernate.cfg.xml 由于 jBPM 的数据库持久化是依靠 Hibernate 进行的,因此需要配置 Hibernate.cfg.xml 使其适应我们的 MySQL 环境 引用org.hibernate.dialect.MySQLInnoDBDialect com.mysql.jdbc.Driver jdbc:mysql:/localhost:3306/linly linly coffee org.hibernate.cache.HashtableCacheProvider 4. Import 需要的 jar 包 这里的 jar 包包括三部分:jbpm 的核心包;Hibernate 及其支撑包; MySQL 的 JDBC 驱动包。 到此,我们的配置工作完成,这是实现 jBPM 流程部署服务端的最小化应用配置。 流程控制及 API 使用 样例程序中的 Handler 接口实现 下面,根据上述的接口分类,列出样例程序中的类名及相应的功能说明,具体可参考源代码。 动作处理接口(ActioinHandler) 这里要提到一个很重要的区别,就是作用于 Node 上的 ActoinHandler 和作用于 Transition上的 ActoinHandler 是有不同的。区别在于,Node 上的 ActoinHandler 在结束业务逻辑处理后,必须调用 executionContext.leaveNode();或executionContext.leaveNode(transition)来保证流程向下执行;而作用于 Transition 上的则不需要。 判定处理接口(DecisionHandlder) 委派处理接口(AssignmentHandler) 流程测试剖析 本章节,我们将给大家剖析两个流程测试类。一个是简单的基于内存模型的流程测试FirstFlowProcessTest;一个是更贴近实用的,基于 MySQL 数据库操作的标准测试案例。通过对这两个测试例程的分析,来直观的学习如何通过 Java API 操作 jPDL。 简单流程测试案例 测试案例类:FirstFlowProcessTest.java Java 代码 1. public class FirstFlowProcessTest extends TestCase 2. ProcessDefinition pdf ; 3. ProcessInstance pi; 4. 5. public void test4000YuanApplication() throws Exception 6. deployProcessDefinition(); 7. createProcessInstance(linly); 8. submitApplication(4000); 9. approveByManager(true); 10. checkTasks(); 11. 12. 13. public void test6000YuanApplication() throws Exception 14. deployProcessDefinition(); 15. createProcessInstance(linly); 16. submitApplication(6000); 17. approveByManager(true); 18. approveByPresident(true); 19. checkTasks(); 20. 21. 22. public void test7000YuanApplication() throws Exception 23. deployProcessDefinition(); 24. createProcessInstance(linly); 25. submitApplication(7000); 26. approveByManager(true); 27. approveByPresident(false); 28. checkTasks(); 29. 30. 31. /* 32.
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号