• 1. SCCE 2010课程体系介绍第3章 jBPM节点
  • 2. 回顾如何创建jBPM数据库 如何使用jBPM基本对象 如何打包部署jBPM 掌握jBPM的Token 掌握jBPM上下文
  • 3. 本章内容流程节点的公共属性 Start和End节点 State和Node节点 Task Node节点 Fork和Join节点 Decision节点
  • 4. 本章目标了解流程节点的公共属性 掌握Start和End节点的使用 掌握State和Node节点的使用 掌握Task Node节点的使用 掌握Fork和Join节点的使用 掌握Decision节点的使用
  • 5. 1. 流程节点的属性 jBPM3.2中提供了多种流程节点,包括Start、End、State、Node、Task Node、Fork、Join以及Decision这几个节点 节点有一些公共的属性 属性名称描述name节点名称,必需属性。在一个流程中,节点名称唯一async处理该节点的操作是否需要异步执行transition可以理解为离开该节点的路径,每条transition都有其名称,如果只有一条则可以省略eventNode支持的事件,包括node-enter和node-leaveexception-handler用于捕获节点抛出的异常timer定时器,用于节点定期执行的动作
  • 6. 2. Start节点和End节点 2.1 Start节点 Start State是整个流程的开始节点,所有的流程实例都从这里开始 Start节点属性和元素的说明 名称说明name节点的名称task开始一个流程实例的任务,或者用于捕获流程发起者event支持的事件类型为node-leavetransition离开转换,每个离开节点的转换必须有一个不同的名称exception-handler一个异常处理器列表,用于这个流程节点中的委托类所抛出的所有异常注意: Start节点支持的事件类型为node-leave,它不支持node-enter
  • 7. 2.1 Start节点给Start节点添加node-leave事件
  • 8. 2.2 End节点每一个流程定义都会有一个结束节点,与开始节点对应 End节点属性和元素的说明 名称说明name节点的名称event支持的事件类型为node-enterexception-handler一个异常处理器列表,用于这个流程节点中的委托类所抛出的所有异常注意: End节点支持的事件类型为node-enter,它不支持node-leave
  • 9. End节点给End节点添加node-enter事件
  • 10. End节点如果不添加Event事件,流程定义文件如下 如果添加Event事件,流程定义文件如下
  • 11. 3. State节点和Node节点 3.1 State节点 State节点也叫手工节点,进入到这种节点时,整个流程的执行就会中断 State节点
  • 12. 3.2 Node节点 Node节点和State节点相反,也称为自动节点。当业务程序实例执行到Node节点时,不会停止执行,而是继续往下执行Node节点
  • 13. Node节点 如果Node节点上没有定义对应的动作Action,那么流程执行到此后将不会停留 如果Node节点上定义了动作Action,那么流程流转到Node节点执行了对应的Action之后,将停留在Node节点上 实现ActionHandler节点的Action如下 public class Node2Action implements ActionHandler { @Override public void execute(ExecutionContext executionContext) throws Exception { System.out.println("Node2Action"); executionContext.getContextInstance().setVariable("var", "actionVar"); } }
  • 14. Node节点 为Node节点添加Action动作 确定Action的名称 使用Handler方式来实现Action
  • 15. Node节点支持的事情有两个:node-enter和node-leave 定义流程图如下 流程定义文件如下Node节点
  • 16. Node节点 JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); ProcessDefinition pd = jbpmContext.getGraphSession().findLatestProcessDefinition("one"); ProcessInstance instance = new pd); Token token = instance.getRootToken(); //获得令牌Token,此时为根令牌,指向开始节点 System.out.println("根令牌,指向开始节点的名称:"+token.getNode().getName()); token.signal(); //流程向下流转 System.out.println("开始节点接收向下信号后节点的名称:"+token.getNode().getName()); token.signal(); //流程继续向下流转 System.out.println("1 当前节点名称:"+token.getNode().getName()); System.out.println("流程状态是否结束:" + token.getProcessInstance().hasEnded()); token.signal(); //流程继续向下流转 System.out.println("2 当前节点名称:"+token.getNode().getName()); System.out.println("流程状态是否结束:" + token.getProcessInstance().hasEnded()); 根令牌,指向开始节点的名称:start 开始节点接收向下信号后节点的名称:state1 进入node2节点 Node2Action 1 当前节点名称:node2 流程状态是否结束:false 离开node2节点 2 当前节点名称:end 流程状态是否结束:true测试流程 流程测试代码如下 流程测试结果如下
  • 17. 4. Task Node节点 Task Node被归类为一个等待节点,是指在Task Node中的Task列表中的Task没有全部执行完之前,它会一直处于等待状态 Task Node节点流程图
  • 18. Task Node节点 任务列表任务名称选择Actor方式将任务分配给谁创建Task Node任务 通过选择Actor分配任务
  • 19. Task Node节点 public class TaskNodeAssignment implements AssignmentHandler { @Override public void assign(Assignable assignable, ExecutionContext executionContext) throws Exception { assignable.setActorId("manager1"); } }将任务分配给manager1选择的Handler类选择Handler的方式分配任务,这种方式通过实现AssignmentHandler节点来定义任务的参与者 编写完成Handler类之后,在Assignment标签页中通过选择Handler的方式来选择该TaskNodeAssignment
  • 20. Task Node节点 使用Actor和Handler的方式分配任务,定义流程文件 使用Actor方式分配任务使用Handler方式分配任务
  • 21. 测试流程 流程测试代码如下 流程测试结果如下 Task Node节点 JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = null; jbpmContext = jbpmConfiguration.createJbpmContext(); ProcessDefinition pd= jbpmContext.getGraphSession().findLatestProcessDefinition("two"); ProcessInstance pi= new ProcessInstancepd Token token = pi.getRootToken(); System.out.println("根令牌,指向开始节点的名称:"+token.getNode().getName()); token.signal(); //流程向下流转 TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator().next(); System.out.println("actor:"+ti.getActorId()); System.out.println("开始节点接收向下信号后节点的名称:"+token.getNode().getName()); token.signal(); //流程继续向下流转 ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator().next(); System.out.println("actor:"+ti.getActorId()); System.out.println("1 当前节点名称:"+token.getNode().getName()); System.out.println("流程状态是否结束:" + token.getProcessInstance().hasEnded()); token.signal(); //流程继续向下流转 System.out.println("2 当前节点名称:"+token.getNode().getName()); System.out.println("流程状态是否结束:" + token.getProcessInstance().hasEnded()); jbpmContext.close();根令牌,指向开始节点的名称:start actor:manager1 开始节点接收向下信号后节点的名称:task-node1 actor:manager2 1 当前节点名称:task-node2 流程状态是否结束:false 2 当前节点名称:end 流程状态是否结束:true
  • 22. 5. Fork节点和Join节点 5.1 Fork节点 一个Fork将一条执行路线分割成多条执行路线 默认分支的行为是为每个离开分支转换建立一个子令牌,在令牌要到达的分支之间建立父-子关系
  • 23. 5.2 Join节点 联合(Join)是所有来自同一个父母的子令牌联合,当全部令牌都进入联合时联合就结束了 当所有兄弟令牌到达联合(Join),父令牌将传播(唯一的)离开转换 当还有兄弟令牌活动时,联合的行为将作为等待状态
  • 24. 5.3 Fork和Join节点的使用 Fork节点和Join节点总是成对出现 Fork节点将流程进行拆分 Join节点将拆分的子Token重新汇聚成一个Token向下流转 一个流程中可以有多个Fork,与之相对应的Join也有多个,且个数相同 Fork和Join流程图
  • 25. 为了实现可以选择不同路径流转,在流程上下文中设置一个变量,通过这个变量来判断流程的流向Fork和Join节点的使用 在这里加入fork节点和join节点流程变量大于100时走的路由流程变量不大于100时走的路由
  • 26. Fork和Join节点的使用测试流程 流程测试代码如下JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = null; jbpmContext = jbpmConfiguration.createJbpmContext(); ProcessDefinition pd = jbpmContext.getGraphSession().findLatestProcessDefinition("three"); ProcessInstance pi = new ProcessInstance(pd); pd.getContextInstance().setVariable("paramName", new Integer(102)); Token token = pd.getRootToken(); System.out.println("根令牌,指向开始节点的名称:"+token.getNode().getName()); token.signal();//流程向下流转 System.out.println("开始节点接收向下信号后节点名称:"+token.getNode().getName()); System.out.println("流程状态是否结束:" + token.getProcessInstance().hasEnded()); jbpmContext.close();流程变量为102,大于100
  • 27. Fork和Join节点的使用 如果将paramName的值改为小于等于100 pd.getContextInstance().setVariable("paramName", new Integer(100)); 上面paramName的值大于100 pd.getContextInstance().setVariable("paramName", new Integer(102));流程测试结果如下: 根令牌,指向开始节点的名称:start 进入node1 进入node2 开始节点接收向下信号后节点名称:end 流程状态是否结束:true 流程测试结果如下: 根令牌,指向开始节点的名称:start 进入node3 开始节点接收向下信号后节点名称:end 流程状态是否结束:true
  • 28. 6. Decision节点 Decision是在流程中定义流程走向,一个Decision用于决定在多个执行路径中选择哪个来执行 Decision节点流程图
  • 29. Decision节点上使用表达式决定流程走向,流程定义文件如下:Decision节点 在这里加入decision节点
  • 30. Decision节点测试流程 流程测试代码如下JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = null; jbpmContext = jbpmConfiguration.createJbpmContext(); ProcessDefinition pd = jbpmContext.getGraphSession().findLatestProcessDefinition("four"); ProcessInstance pi = new ProcessInstance(pd); Token token = pi.getRootToken(); System.out.println("根令牌,指向开始节点的名称:"+token.getNode().getName()); token.signal();//流程向下流转 System.out.println("开始节点接收向下信号后节点名称:"+token.getNode().getName()); jbpmContext.close();流程测试结果如下: 根令牌,指向开始节点的名称:start 进入node2 开始节点接收向下信号后节点名称:end
  • 31. Decision节点 如果将流程定义文件中的decision节点进行如下修改 流程测试结果如下: 根令牌,指向开始节点的名称:start 进入node3 开始节点接收向下信号后节点名称:end
  • 32. Decision节点动态设置Decision节点的Expression属性,根据传入的参数不同,流程将有不同的走向
  • 33. Decision节点测试流程 流程测试代码如下JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance(); JbpmContext jbpmContext = null; jbpmContext = jbpmConfiguration.createJbpmContext(); ProcessDefinition pd = jbpmContext.getGraphSession().findLatestProcessDefinition("four"); ProcessInstance pi = new ProcessInstance(pd); pi.getContextInstance().setVariable("way", "to node2"); Token token = pi.getRootToken(); System.out.println("根令牌,指向开始节点的名称:"+token.getNode().getName()); token.signal();//流程向下流转 System.out.println("开始节点接收向下信号后节点名称:"+token.getNode().getName()); jbpmContext.close();定义上下文变量way流程测试结果如下: 根令牌,指向开始节点的名称:start 进入node2 开始节点接收向下信号后节点名称:end
  • 34. 总结了解流程节点的公共属性 掌握Start和End节点用法 掌握State和Node节点用法 掌握Task Node节点用法 掌握Fork和Join节点用法 掌握Decision节点用法
  • 35. (本页无文本内容)