第4章 jBPM应用(理论).ppt
SCCE 2010SCCE 2010课程体系介绍课程体系介绍第第4 4章章jBPMjBPM应用应用回顾回顾u了解流程节点的公共属性 u掌握Start、State、Node、Task Node、Fork、Join、Decision、End等节点用法本章内容本章内容uWeb应用中对jBPM的支持 u支持jBPM的配置文件u支持jBPM的JAR包u带中文流程的处理ujBPM整合Struts的开发步骤本章目标本章目标u了解支持jBPM的Web应用u了解支持jBPM的配置文件u了解支持jBPM的JAR包u熟悉jBPM开发带中文流程的实现方式u熟练掌握jBPM整合Struts的开发步骤1.创建创建jBPM Web工程工程 ujBPM的工作流引擎可以使用在C/S应用中,也可以使用在B/S的应用中u目前的发展形势看,以B/S架构的Web应用系统是主流u实际的应用中,一般不会也不应该将业务数据放在流程中处理1.1 创建创建Struts工程工程u使用MyEclipse创建一个Web工程,再添加Struts特性1.2 配置配置jBPM ujBPM配置文件 配置文件名称描述hibernatge.cfg.xml必需的。jBPM采用Hibernate来持久化数据jbpm.cfg.xml可选的。jBPM运行时所需的配置文件,如果没有,jBPM将使用默认的配置文件jbpm.mail.templates.xml可选的。jBPM邮件提醒的配置文件log4j.properties可选的。日志输出配置文件配置配置jBPM ujBPM运行所需的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工程中自动添加 2.开发流程开发流程 2.1 请假单需求说明 n请假流程如下 员工登录系统,填写请假单 完成请假申请以后,请假单将根据流程流转到该员工所在部门的部门主管处进行审批 如果部门主管审批不通过,则流程结束 如果请假天数大于5天,则需要总经理审批 如果请假天数小于5天,则请假单将直接送到人事部门 如果总经理审批不通过,则流程结束 如果总经理审批通过,则请假单送到人事部门,最后由人事部门处理完成请假流程 2.2 创建流程图创建流程图 u根据请假需求说明,创建请假流程图 创建流程图创建流程图 ujBPM设计器对中文的支持不是很好,重新打开流程设计器u查看流程节点定位信息文件gpd.xml 创建流程图创建流程图 u产生中文乱码的原因njBPM设计器在产生gpd.xml时,使用的是本地编码。Linux的本地编码为utf-8,所以不存在问题;但是Windows不是,所以导致了乱码 u解决方案nMyEclipse的启动的快捷键中加入-Vmargs-Dfile.encoding=UTF-8u通过上面方法,jvm的默认编码就变成UTF-8,因此就不会产生中文乱码的问题了注意:解决中文问题后,其他地方会出现乱码。所以改变快捷方式最好只用于定义、修改以及发布流程定义,在编码阶段再切换回原来的环境 2.3 分配任务分配任务 u假设有公司组织机构如下:n员工emp1和emp2n员工的部门主管分别为manager1和manager2n总经理为bossn人事部门为personnel分配任务分配任务 u请假单部门主管参与者的分配 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);elsearg0.setActorId(manager2);设置emp1的部门主管的参与者manager1设置emp2的部门主管的参与者manager2分配任务分配任务 u请假单总经理参与者的分配 public class BossAssignment implements AssignmentHandler public void assign(Assignable arg0,ExecutionContext arg1)throws Exception arg0.setActorId(boss);设置总经理的参与者boss分配任务分配任务 u请假单人事处理参与者的分配 public class PersonnelAssignment implements AssignmentHandler public void assign(Assignable arg0,ExecutionContext arg1)throws Exception arg0.setActorId(personnel);设置人事的参与者personnel 2.4 流程动作流程动作 u请假结束以后,为了将审批结果通知申请人,使用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+,您的请假申请审批已经通过);elseSystem.out.println(user+,您的请假申请审批没有通过);arg0.getToken().signal();2.5 流程定义文件流程定义文件 u以Handler方式给部门主管的参与者分配任务 u以Handler方式给总经理的参与者分配任务 u以Handler方式给人事部的参与者分配任务 u以Action方式将审批信息通知请假申请人 u判断请假天数的Decision节点采用Expression方式判断流程走向流程定义文件流程定义文件 u流程定义文件的XML代码 2.6 测试流程测试流程 u创建数据库方法public void testCreateDB()throws Exception/获得JbpmConfiguration对象JbpmConfiguration jbpmConfiguration=JbpmConfiguration.getInstance();jbpmConfiguration.createSchema();u部署流程 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();测试流程测试流程 u创建流程实例以及相应的处理方式 public void createPi()/获得流程定义pd=ProcessDefinition.parseXmlResource(leave/processdefinition.xml);pi=new ProcessInstance(pd);/获得流程实例pi.getContextInstance().createVariable(leaveEmp,emp1);/设置申请人pi.getRootToken().signal();/流程从开始节点流转到申请请假表单节点u提交请假申请,业务数据放入上下实例变量中 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(提交请假申请);测试流程测试流程 u管理员审核 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(部门主管审批不通过);测试流程测试流程 u总经理审核 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(总经理审核通过);elseti.getContextInstance().setVariable(approveResult,0);ti.getContextInstance().setVariable(processResult,总经理审核不通过);ti.end(boss disagree);System.out.println(总经理审核不通过);测试流程测试流程 u人事审核 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(请假人事处理审核通过);u如果请假3天,测试请假流程 n请假3天,部门主管审核通过 n请假3天,部门主管审核不通过 测试流程测试流程 public void testLeave3DaysProcess()createPi();submitLeave(“3”);/请假3天managerDecide(“”,true);/部门主管审核通过personnelDecide();public void testLeave3DaysProcess()createPi();submitLeave(“3”);/请假3天managerDecide(“”,false);/部门主管审核不通过personnelDecide();测试结果如下:提交请假申请部门主管审批参与者:manager1部门主管审批通过请假人事处理审核参与者:personnelemp1,您的请假申请请假人事处理审核通过请假人事处理审核通过测试结果如下:提交请假申请部门主管审批参与者:manager1emp1,您的请假申请部门主管审批不通过部门主管审批不通过 测试流程测试流程 public void testLeave8DaysProcess()createPi();submitLeave(8);managerDecide(,true);bossDecide(,true);personnelDecide();public void testLeave8DaysNotProcess()createPi();submitLeave(8);managerDecide(,true);bossDecide(,false);测试结果如下:提交请假申请部门主管审批参与者:manager1部门主管审批通过size:3总经理审核参与者:bossemp1,您的请假申请总经理审核不通过总经理审核不通过 测试结果如下:提交请假申请部门主管审批参与者:manager1部门主管审批通过size:3总经理审核参与者:boss总经理审核通过请假人事处理审核参与者:personnelemp1,您的请假申请请假人事处理审核通过请假人事处理审核通过 u如果请假8天,测试请假流程 n请假8天,部门主管审核通过,总经理审核通过 n请假8天,部门主管审核通过,总经理审核不通过 3.jBPM+Struts整合请假单整合请假单 3.1 jBPM+Struts整合请假单步骤 u搭建工程,开发流程n搭建支持jBPM的Struts工程,并创建请假流程u用户登录实现n创建UserAction类,用于处理员工的登录 u请假实现 n创建LeaveAction类,用于处理请假单申请 u流程任务处理 n创建TaskAction类,用于实现任务的处理和流转 u页面处理 总结总结u掌握jBPM的Web工程的搭建 ujBPM的配置文件nhibernatge.cfg.xmlnjbpm.cfg.xmlnjbpm.mail.templates.xmlujBPM的JAR包njbpm-jpdl.jarnjbpm-identity.jarujBPM流程的中文处理方式:改变Windows下jvm的默认编码,在MyEclipse的启动的快捷键中加入-Vmargs-Dfile.encoding=UTF-8u掌握jBPM整合Struts的步骤及应用