第4章 jBPM应用(理论)
liulp_1985
贡献于2013-05-06
2578
0
0
第4章 jBPM应用(理论)
下载需要
3
金币
[ 金币充值 ]
服务器/托管费、人工审核、技术维护等都需要很多费用,请您支持深度开源的发展
下载PPT
标签:
jBPM
工作流引擎
方案
XML
PPT 内容
1. SCCE 2010课程体系介绍第4章 jBPM应用
2. 回顾了解流程节点的公共属性 掌握Start、 State、 Node 、 Task Node 、 Fork 、 Join 、 Decision、End等节点用法
3. 本章内容Web应用中对jBPM的支持 支持jBPM的配置文件 支持jBPM的JAR包 带中文流程的处理 jBPM整合Struts的开发步骤
4. 本章目标了解支持jBPM的Web应用 了解支持jBPM的配置文件 了解支持jBPM的JAR包 熟悉jBPM开发带中文流程的实现方式 熟练掌握jBPM整合Struts的开发步骤
5. 1. 创建jBPM Web工程 jBPM的工作流引擎可以使用在C/S应用中,也可以使用在B/S的应用中 目前的发展形势看,以B/S架构的Web应用系统是主流 实际的应用中,一般不会也不应该将业务数据放在流程中处理
6. 1.1 创建Struts工程使用MyEclipse创建一个Web工程,再添加Struts特性
7. 1.2 配置jBPM jBPM配置文件 配置文件名称描述hibernatge.cfg.xml必需的。jBPM采用Hibernate来持久化数据jbpm.cfg.xml可选的。jBPM运行时所需的配置文件,如果没有,jBPM将使用默认的配置文件jbpm.mail.templates.xml可选的。jBPM邮件提醒的配置文件log4j.properties可选的。日志输出配置文件
8. 配置jBPM jBPM运行所需的JAR包 JAR文件名称描述jbpm-jpdl.jar必需的。jBPM工作流引擎核心包jbpm-identity.jar必需的。jBPM身份组件包hibernate3.jar必需的。jBPM持久层Hibernate核心包antlr.jar必需的。Hibernate使用antlr产生查询分析器cglib.jar必需的。CGLIB核心库asm.jar必需的。ASM字节码库,cglib.jar依赖的包jta.jar必需的。JTA规范包dom4j.jar必需的。解析XML配置文件和映射文件包mail.jar必需的。jBPM工作流引擎发送邮件包注意:除了jbpm-jpdl.jar和jbpm-identity.jar这两个包 需要复制外,其他的包都可以在SSH工程中自动添加
9. 2. 开发流程 2.1 请假单需求说明 请假流程如下 员工登录系统,填写请假单 完成请假申请以后,请假单将根据流程流转到该员工所在部门的部门主管处进行审批 如果部门主管审批不通过,则流程结束 如果请假天数大于5天,则需要总经理审批 如果请假天数小于5天,则请假单将直接送到人事部门 如果总经理审批不通过,则流程结束 如果总经理审批通过,则请假单送到人事部门,最后由人事部门处理完成请假流程
10. 2.2 创建流程图 根据请假需求说明,创建请假流程图
11. 创建流程图 jBPM设计器对中文的支持不是很好,重新打开流程设计器查看流程节点定位信息文件gpd.xml
12. 创建流程图 产生中文乱码的原因 jBPM设计器在产生gpd.xml时,使用的是本地编码。Linux的本地编码为utf-8,所以不存在问题;但是Windows不是,所以导致了乱码 解决方案 MyEclipse的启动的快捷键中加入-Vmargs -Dfile.encoding=UTF-8通过上面方法,jvm的默认编码就变成UTF-8,因此就不会产生中文乱码的问题了注意: 解决中文问题后,其他地方会出现乱码。所以改变快捷方式最好 只用于定义、修改以及发布流程定义,在编码阶段再切换回原来的环境
13. 2.3 分配任务 假设有公司组织机构如下: 员工emp1和emp2 员工的部门主管分别为manager1和manager2 总经理为boss 人事部门为personnel
14. 分配任务 请假单部门主管参与者的分配 public class ManagerAssignment implements AssignmentHandler{ public void assign(Assignable arg0, ExecutionContext arg1) throws Exception { //从上下文实例获得申请员工 String leaveEmp = arg1.getContextInstance().getVariable("leaveEmp").toString(); if("emp1".equals(leaveEmp)){ arg0.setActorId("manager1"); } else{ arg0.setActorId("manager2"); } } }设置emp1的部门主管的参与者manager1设置emp2的部门主管的参与者manager2
15. 分配任务 请假单总经理参与者的分配 public class BossAssignment implements AssignmentHandler { public void assign(Assignable arg0, ExecutionContext arg1) throws Exception { arg0.setActorId("boss"); } }设置总经理的参与者boss
16. 分配任务 请假单人事处理参与者的分配 public class PersonnelAssignment implements AssignmentHandler { public void assign(Assignable arg0, ExecutionContext arg1) throws Exception { arg0.setActorId("personnel "); } }设置人事的参与者personnel
17. 2.4 流程动作 请假结束以后,为了将审批结果通知申请人,使用Action动作处理,在控制台打印消息说明请假结果public class LeaveNotifyAction implements ActionHandler { public void execute(ExecutionContext arg0) throws Exception { boolean flag = false; ContextInstance ci = arg0.getContextInstance(); //获得流程上下文对象 String user = (String)ci.getVariable("leaveEmp"); //获得申请人 //获得请假申请是否通过 String approveResult = (String)ci.getVariable("approveResult"); if("1".equals(approveResult)){ flag = true; } if(flag){ System.out.println(user+",您的请假申请审批已经通过"); } else{ System.out.println(user+",您的请假申请审批没有通过"); } arg0.getToken().signal(); } }
18. 2.5 流程定义文件 以Handler方式给部门主管的参与者分配任务 以Handler方式给总经理的参与者分配任务 以Handler方式给人事部的参与者分配任务 以Action方式将审批信息通知请假申请人 判断请假天数的Decision节点采用Expression方式判断流程走向
19. 流程定义文件 流程定义文件的XML代码
20. 2.6 测试流程 创建数据库方法public void testCreateDB() throws Exception { //获得JbpmConfiguration对象 JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); jbpmConfiguration.createSchema(); }部署流程 JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); String fileName = "E:/leaveWeb.zip";//定义流程打包文件的路径 jbpmContext = jbpmConfiguration.createJbpmContext(); InputStream is = new FileInputStream(new File(fileName)); ZipInputStream zis = new ZipInputStream(is); ProcessDefinition pd = ProcessDefinition.parseParZipInputStream(zis); jbpmContext.deployProcessDefinition(pd); zis.close(); is.close(); jbpmContext.close();
21. 测试流程 创建流程实例以及相应的处理方式 public void createPi(){ //获得流程定义 pd = ProcessDefinition.parseXmlResource("leave/processdefinition.xml"); pi = new ProcessInstance(pd); //获得流程实例 pi.getContextInstance().createVariable("leaveEmp","emp1"); //设置申请人 pi.getRootToken().signal(); //流程从开始节点流转到申请请假表单节点 }提交请假申请,业务数据放入上下实例变量中 public void submitLeave(String days){ //获得请假表单的任务实例 TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next(); ContextInstance ci = pi.getContextInstance(); ci.setVariable("days",days); ti.setVariable("title", "请假"); ti.setVariable("days", days); ti.setVariable("reason", "生病"); ti.end(); System.out.println("提交请假申请"); }
22. 测试流程 管理员审核 public void managerDecide(String manager,boolean flag){ //查询所有任务实例 Collection
tiList = (Collection
)pi.getTaskMgmtInstance().getTaskInstances(); for(TaskInstance ti:tiList){ if("部门主管审批".equals(ti.getName())){//匹配任务实例名称为“部门主管审批”的任务 System.out.println("部门主管审批参与者:"+ti.getActorId()); if(flag){ ti.getContextInstance().setVariable("approveResult", "1"); ti.getContextInstance().setVariable("processResult", "部门主管审批通过"); ti.end("manager agree"); System.out.println("部门主管审批通过"); } else{ ti.getContextInstance().setVariable("approveResult", "0"); ti.getContextInstance().setVariable("processResult", "部门主管审批不通过"); ti.end("manager disagree"); System.out.println("部门主管审批不通过"); } } } }
23. 测试流程 总经理审核 public void bossDecide(String manager,boolean flag){ Collection
tiList = (Collection
)pi.getTaskMgmtInstance().getTaskInstances(); System.out.println("size:"+tiList.size()); for(TaskInstance ti:tiList){//匹配任务实例名称为“部门主管审批”的任务 if("总经理审核".equals(ti.getName())){ System.out.println("总经理审核参与者:"+ti.getActorId()); if(flag){ ti.getContextInstance().setVariable("approveResult", "1"); ti.getContextInstance().setVariable("processResult", "总经理审核通过"); ti.end("boss agree"); System.out.println("总经理审核通过"); } else{ ti.getContextInstance().setVariable("approveResult", "0"); ti.getContextInstance().setVariable("processResult", "总经理审核不通过"); ti.end("boss disagree"); System.out.println("总经理审核不通过"); } } } }
24. 测试流程 人事审核 public void personnelDecide(String manager){ //查询所有任务实例 Collection
tiList = (Collection
)pi.getTaskMgmtInstance().getTaskInstances(); for(TaskInstance ti:tiList){//匹配任务实例名称为“部门主管审批”的任务 if("请假人事处理".equals(ti.getName())){ System.out.println("请假人事处理审核参与者:"+ti.getActorId()); ti.getContextInstance().setVariable("processResult", "请假人事处理审核通过"); ti.end(); System.out.println("请假人事处理审核通过"); } } }
25. 如果请假3天,测试请假流程 请假3天,部门主管审核通过 请假3天,部门主管审核不通过 测试流程 public void testLeave3DaysProcess() { createPi(); submitLeave(“3”);//请假3天 managerDecide(“”,true);//部门主管审核通过 personnelDecide(""); }public void testLeave3DaysProcess() { createPi(); submitLeave(“3”);//请假3天 managerDecide(“”,false);//部门主管审核不通过 personnelDecide(""); }测试结果如下: 提交请假申请 部门主管审批参与者:manager1 部门主管审批通过 请假人事处理审核参与者:personnel emp1,您的请假申请请假人事处理审核通过 请假人事处理审核通过测试结果如下: 提交请假申请 部门主管审批参与者:manager1 emp1,您的请假申请部门主管审批不通过 部门主管审批不通过
26. 测试流程 public void testLeave8DaysProcess() { createPi(); submitLeave("8"); managerDecide("",true); bossDecide("",true); personnelDecide(""); }public void testLeave8DaysNotProcess () { createPi(); submitLeave("8"); managerDecide("",true); bossDecide("",false); }测试结果如下: 提交请假申请 部门主管审批参与者:manager1 部门主管审批通过 size:3 总经理审核参与者:boss emp1,您的请假申请总经理审核不通过 总经理审核不通过 测试结果如下: 提交请假申请 部门主管审批参与者:manager1 部门主管审批通过 size:3 总经理审核参与者:boss 总经理审核通过 请假人事处理审核参与者:personnel emp1,您的请假申请请假人事处理审核通过 请假人事处理审核通过 如果请假8天,测试请假流程 请假8天,部门主管审核通过,总经理审核通过 请假8天,部门主管审核通过,总经理审核不通过
27. 3. jBPM + Struts整合请假单 3.1 jBPM + Struts整合请假单步骤 搭建工程,开发流程 搭建支持jBPM的Struts工程,并创建请假流程 用户登录实现 创建UserAction类,用于处理员工的登录 请假实现 创建LeaveAction类,用于处理请假单申请 流程任务处理 创建TaskAction类,用于实现任务的处理和流转 页面处理
28. 总结掌握jBPM的Web工程的搭建 jBPM的配置文件 hibernatge.cfg.xml jbpm.cfg.xml jbpm.mail.templates.xml jBPM的JAR包 jbpm-jpdl.jar jbpm-identity.jar jBPM流程的中文处理方式:改变Windows下jvm的默认编码,在MyEclipse的启动的快捷键中加入-Vmargs -Dfile.encoding=UTF-8 掌握jBPM整合Struts的步骤及应用
29. (本页无文本内容)
PPT 图集
相关PPT
第4章 jBPM应用(理论)
第5章 jBPM+SSH(理论)
第2章 jBPM基础(理论)
第3章 jBPM节点(理论)
第1章_工作流简介(理论)
JBPM工作流介绍
第02章 工作流管理系统实现
第4章 hibernate应用
第05章 工作流执行服务
jBPM 工作流管理系统