• 1. SCCE 2010课程体系介绍第2章 jBPM基础
  • 2. 回顾什么是工作流管理系统 什么是jBPM 如何使用jBPM流程设计器 掌握jBPM的应用
  • 3. 本章内容jBPM数据库表的两种创建方式 jBPM的基本对象 jBPM流程的打包部署 jBPM的Token令牌 jBPM流程上下文
  • 4. 本章目标了解jBPM数据库表的创建 掌握jBPM的基本对象 掌握jBPM流程的打包部署 理解jBPM的Token令牌 了解jBPM的流程上下文
  • 5. 1. jBPM数据库表 1.1 schema文件创建jBPM数据库表 使用schema文件进行创建时,需要在jBPM套件的db目录下找到与安装的目标数据库相同的数据库脚本
  • 6. 1.2 自动创建jBPM数据库表 jBPM可以使用JbpmConfiguration对象提供的createSchema方法来创建数据库//创建数据库 public void testCreateDB() throws Exception { //JbpmConfiguration对象将在下一节中详细介绍 JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); jbpmConfiguration.createSchema(); }
  • 7. 自动创建jBPM数据库表 在创建数据库之前,需在classpath中添加hibernate.cfg.xml文件,配置数据库连接信息、数据库方言以及jBPM信息 org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/jbpm_mysql root 000000 省略jBPM映射文件
  • 8. 自动创建jBPM数据库表 创建的jBPM数据库
  • 9. 自动创建jBPM数据库表 jBPM数据库表的说明 流程配置类数据库表 表名说明BPM_PROCESSDEFINITION流程模版表JBPM_NODE流程节点表JBPM_TRANSITION流程迁移表JBPM_ACTION流程动作表JBPM_EVENT流程事件表JBPM_DELEGATION流程代理类表(用于实例化jBPM中的Action类)JBPM_TASK流程任务表JBPM_TASKCONTROLLER流程任务控制器JBPM_VARIABLEACCESS流程变量表JBPM_MODULEDEFINITION流程模块定义表JBPM_EXCEPTIONHANDLER流程异常处理器表JBPM_DECISIONCONDITION结果条件表JBPM_ SWINLANEDECISION节点判断条件表
  • 10. 自动创建jBPM数据库表 jBPM数据库表的说明 流程运行类数据库表 表名说明JBPM_PROCESSINSTANCE流程实例表JBPM_TOKEN流程TOKEN表JBPM_LOG流程日志表JBPM_RUNTIMEACTION流程实时ACTION表JBPM_VARIABLEINSTANCE流程变量实例表JBPM_COMMENT流程备注信息表JBPM_MESSAGE流程异步消息表JBPM_TIMER流程定时器表JBPM_TOKENVARIABLEMAP流程TOKEN变量MAP表JBPM_MODULEINSTANCE流程模块实例表JBPM_BYTEARRAY存储processimage.jpg文件JBPM_BYTEBLOCK存储processimage.jpg文件的二进制文件
  • 11. 2. jBPM基本对象 2.1 JbpmConfiguration对象 JbpmConfiguration主要用于读取配置文件,并且提供流程运行过程中所需要的各种服务对象 jBPM套件的源文件目录org.jbpm包下面有一个default.jbpm.cfg.xml文件,它是jBPM默认采用的配置文件
  • 12. 2.1 JbpmConfiguration对象 修改默认配置方式 在classpath下面新建一个jbpm.cfg.xml文件 jbpm.cfg.xml代码
  • 13. JbpmConfiguration对象 JbpmConfiguration是一个单例对象,通过JbpmConfiguration的静态方法getInstance()获得 JbpmConfiguration是一个单例对象,通过JbpmConfiguration的静态方法getInstance()获得 JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
  • 14. JbpmConfiguration对象 JbpmConfiguration常用方法 创建jBPM数据库:Public void createSchema() 删除jBPM数据库:Public void dropSchema()
  • 15. 2.2 JbpmContext对象 JbpmContext对象主要用于操作流程,可以新建流程、查找任务实例、获取某个人的代办任务等等 JbpmConfiguration对象提供的方法获得JbpmContext对象,在使用完JbpmContext后必须调用JbpmContext的close()方法将其关闭 public void testJbpmObject() throws Exception { //通过JbpmConfiguration的静态方法获得JbpmConfiguration实例 JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); //通过JbpmConfiguration获得JbpmContext对象 JbpmContext jbpmContext = null; try { jbpmContext = jbpmConfiguration.createJbpmContext(); //省略具体流程的操作 } catch (Exception e) { e.printStackTrace(); } finally{ jbpmContext.close(); //关闭JbpmContext对象 } }
  • 16. JbpmContext对象 使用过滤器来获得JbpmContext对象。 Web应用中可以通过JbpmConfiguration对象提供的getCurrentJbpmContext()方法获得一个JbpmContext对象 jBPM套件的源文件目录org.jbpm.web包下面有一个JbpmContextFilter文件,该文件就是jBPM为JbpmContext提供了一个Filter类,主要代码如下: JbpmContext jbpmContext = getJbpmConfiguration().createJbpmContext(jbpmContextName); try { if (isAuthenticationEnabled) { jbpmContext.setActorId(actorId); } filterChain.doFilter(servletRequest, servletResponse); } finally { jbpmContext.close(); }
  • 17. JbpmContext对象 使用过滤器,JbpmContext对象,可以通过JbpmConfiguration对象提供的getCurrentJbpmContext()方法获得。在使用完毕后,关闭JbpmContext的工作由filter来完成,无须用户手工操作 使用过滤器的弊端: 用户每次向服务器端发送请求时,无论是否需要使用该JbpmContext对象,filter都会创建该对象,这会对性能产生一定的影响
  • 18. 2.3 ProcessDefinition对象 ProcessDefinition是流程定义对象,对应的数据表是jbpm_processdefinition 。流程定义有版本控制,允许同名的流程定义共存 ProcessDefinition(流程定义)就是在jBPM的可视化流程设计器中拖拽的流程,流程设计完成后可以发布到数据库中
  • 19. ProcessDefinition对象 Public ProcessInstance createProcessInstance();Public static ProcessDefinition parseXmlInputStream(java.io.InputStream is);Public ProcessInstance createProcessInstance(java.util.Map variables);Public static ProcessDefinition parseXmlResource (String xmlResource);Public static ProcessDefinition parZipInputStream (java.io.ZipInputStream zis);流程定义的常用方法: 创建流程实例 创建一个新的流程实例 通过解析给出的流程定义的XML文件流,生成一个流程定义对象 通过给出的指定位置的流程定义的XML文件解析成一个流程定义对象 通过解析给出的流程定义的ZIP文件,生成一个流程定义对象
  • 20. ProcessDefinition对象 流程定义的应用 首先定义流程
  • 21. ProcessDefinition对象 部署流程 public void testDeploy() throws Exception { //获得JbpmConfiguration对象 JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); //通过JbpmConfiguration获得JbpmContext对象 JbpmContext jbpmContext = null; //定义流程定义文件 ProcessDefinition pd = ProcessDefinition.parseXmlResource("simple/processdefinition.xml"); try { jbpmContext = jbpmConfiguration.createJbpmContext(); jbpmContext.deployProcessDefinition(pd); //发布流程 } catch (Exception e) { e.printStackTrace(); } finally{ jbpmContext.close(); //关闭JbpmContext对象 } }
  • 22. jBPM数据库表变化 流程定义表如下 流程迁移表如下 流程节点表如下 流程模块定义表如下 ProcessDefinition对象 流程名称流程版本
  • 23. ProcessDefinition对象 把上面流程重新后,再定义一个新的流程部署,新的流程如下:
  • 24. jBPM数据库表变化: 流程定义表如下 流程迁移表如下 流程节点表如下 流程模块定义表如下 ProcessDefinition对象
  • 25. ProcessDefinition对象 获得最新版本的流程定义对象 public void testGetPd() throws Exception { JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = null; try { jbpmContext = jbpmConfiguration.createJbpmContext(); //根据流程名称获得最新流程定义 ProcessDefinition pd = jbpmContext.getGraphSession().findLatestProcessDefinition("simple"); System.out.println("最新流程定义ID:"+pd.getId()); System.out.println("最新流程定义版本:"+pd.getVersion()); } catch (Exception e) { e.printStackTrace(); } finally{ jbpmContext.close(); //关闭JbpmContext 对象 } } 测试结果: 最新流程定义ID:2 最新流程定义版本:2
  • 26. ProcessDefinition对象 获取所有最新版本的流程定义对象 public void testGetPd() throws Exception { JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = null; try { jbpmContext = jbpmConfiguration.createJbpmContext(); List pdList = jbpmContext.getGraphSession().findLatestProcessDefinitions(); for(ProcessDefinition pd:pdList){ System.out.println("流程定义ID:"+pd.getId()); System.out.println(“流程定义版本:”+pd.getVersion()); } } catch (Exception e) { e.printStackTrace(); } finally{ jbpmContext.close(); //关闭JbpmContext 对象 } } 测试结果:流程定义ID:3 流程定义版本:1 流程定义ID:2 流程定义版本:2
  • 27. ProcessDefinition对象 获取特定版本的流程定义对象 public void testGetPd() throws Exception { JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = null; try { jbpmContext = jbpmConfiguration.createJbpmContext(); ProcessDefinition pd = jbpmContext.getGraphSession().findProcessDefinition("simple", 1); System.out.println("版本为1的流程定义ID:"+pd.getId()); System.out.println("版本为1的流程定义版本:"+pd.getVersion()); } catch (Exception e) { e.printStackTrace(); } finally{ jbpmContext.close(); //关闭JbpmContext 对象 } } 测试结果:最新流程定义ID:1 最新流程定义版本:1
  • 28. 2.4 ProcessInstance对象 流程实例(ProcessInstance)是基于流程定义的,一个流程定义可以有多个流程实例,而一个流程实例只能有一个流程定义,它们之间是一对多的关系
  • 29. 流程实例的常用方法 获取当前流程实例对应的流程上下文对象 获取流程定义对象 获取流程实例的Token对象 驱动流程向下流转 获取流程实例对应的任务实例管理对象 暂停流程实例 使处于暂停状态的流程实例恢复到可执行状态 ProcessInstance对象 Public void resume();Public void suspend();Public TaskMgmtInstance getTaskMgmtInstance();Public void signal();Public Token getRootToken();Public ProcessDefinition getProcessDefinition();Public ContextInstance getContextInstance();
  • 30. ProcessInstance对象 创建流程实例并向流程实例表中插入数据 如下:public void testGetPd() throws Exception { JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = null; try { jbpmContext = jbpmConfiguration.createJbpmContext(); ProcessDefinition pd = jbpmContext.getGraphSession().findLatestProcessDefinition("leave"); //创建流程实例 ProcessInstance pi = (ProcessInstance)processDefinition.createInstance(); System.out.println("流程实例Id:"+pi.getId()); } catch (Exception e) { e.printStackTrace(); } finally{ jbpmContext.close(); //关闭JbpmContext 对象 } }
  • 31. 3.1流程打包 jBPM流程的打包过程 打开流程设计器中相应的流程 选择“Deployment”标签 把3个流程文件打包成zip包 3. jBPM流程发布 把3个流程文件打包成zip包
  • 32. 3.2 流程发布 前面的部署流程只是部署了一个流程定义文件,现在部署打包的zip包 public void testDeployByZip() throws Exception { JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = null; String fileName = "E:/leave.zip"; //定义流程打包文件的路径 try { 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(); } catch (Exception e) { e.printStackTrace(); } finally{ jbpmContext.close(); //关闭JbpmContext对象 } } 发布后,jbpm_bytearray表和jbpm_byteblock表中数据分别如下
  • 33. 4. Token令牌 在jBPM中,一个运行标记Token代表一个processDefinintion中的一次执行,用于维护流程设计图中结点的指针 Token需要一个信号(signal)来使流程向前执行,信号signal用于指引一个令牌Token去继续一个图的执行注意: 在流程实例ProcessInstance中,信号signal是委派给根令牌 root token的。因此对流程实例的信号实际就是根令牌的信号
  • 34. 一个流程定义可以有多个流程实例,当一个流程实例创建时,该流程的 主路径就会随之创建。获得根令牌代码如下: 触发流程实例往下运行的操作包含以下两个 强制执行ProcessInstance的signal操作 执行TaskInstance的end操作 Token令牌 Token token = processInstance.getRootToken();
  • 35. 5. 流程上下文 上下文Context是处理流程变量的地方。流程变量使用键值对来维护流程实例相关的信息,上下文必须要存储到数据库中 获得流程上下文的方法为:ContextInstance context = processInstance.getContextInstance();
  • 36. 流程上下文 流程上下文中,流程变量支持覆盖操作 public void testContextInstance() throws Exception { try { ProcessDefinition pd = ProcessDefinition.parseXmlResource("simple/processdefinition.xml"); ProcessInstance instance = new ProcessInstance(processDefinition); //获得流程上下文 ContextInstance contextInstance = instance.getContextInstance(); contextInstance.setVariable("var", "设置变量"); String varStr = (String)contextInstance.getVariable("var"); System.out.println("变量名称:"+varStr); contextInstance.setVariable("var", "重新设置变量"); varStr = (String)contextInstance.getVariable("var"); System.out.println("变量名称:"+varStr); contextInstance.setVariable("var", new Integer(1)); Integer varInt = (Integer)contextInstance.getVariable("var"); System.out.println("变量名称:"+varInt); } catch (Exception e) { e.printStackTrace(); } } 运行结果: 变量名称:设置变量 变量名称:重新设置变量 变量名称:1
  • 37. 总结如何创建jBPM数据库 如何使用jBPM基本对象 如何打包部署jBPM 掌握jBPM的Token 掌握jBPM上下文
  • 38. (本页无文本内容)