传智播客JBPM2Advance.ppt

上传人:本田雅阁 文档编号:2299275 上传时间:2019-03-18 格式:PPT 页数:36 大小:286.51KB
返回 下载 相关 举报
传智播客JBPM2Advance.ppt_第1页
第1页 / 共36页
传智播客JBPM2Advance.ppt_第2页
第2页 / 共36页
传智播客JBPM2Advance.ppt_第3页
第3页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《传智播客JBPM2Advance.ppt》由会员分享,可在线阅读,更多相关《传智播客JBPM2Advance.ppt(36页珍藏版)》请在三一文库上搜索。

1、北京传智播客教育 ,基于jBPM的应用开发 高级特性,讲师:孙文举,北京传智播客教育 ,课程目标,掌握各种节点的基本用法 理解各种节点的应用场景 在什么样的需求驱动下用哪一种节点以及用节点内部何种处理机制来实现满足需求 了解jBPM对同一问题可能有多种解决方案,北京传智播客教育 ,内容,start-state end-state task-node node state decision fork/join subprocess superstate action event,script timer 任务分配给多个参与者 swimlane pooled actors task control

2、ler JobExecutor mail-node 如何添加新的节点类型,北京传智播客教育 ,start-state & end-state,start-state标识流程开始边界 支持事件类型:node-leave 可以包含task元素(需要在流程实例创建之前进行认证) 如果指定了task元素,则task的参与者只能通过认证的方式来分配,并且可以通过swimlane来记录下任务的参与者 end-state标识流程的结束边界 支持事件类型:node-enter 不需要transition元素 无实例信息,所以不会被持久化 典型用法 ,北京传智播客教育 ,节点task-node,流程实际业务逻辑

3、组成 task的实例信息被持久化 支持事件类型 node-enter | node leave attribute signal create-tasks end-tasks 典型形式 ,北京传智播客教育 ,节点task-node(task),task有四种事件类型:task-create, task-assign, task-start , task-end task的assignment 可以有多种方式 assignmentHandler actor-id=“expression” pooled-actor=“1,2,3” swimlane,北京传智播客教育 ,节点task-node(补充

4、),graph 元素中包括task-node在内的所有节点都不能在流程的执行过程中动态的增加 如果有类似的需求,可以通过程序创建多个task的实例,北京传智播客教育 ,任务分配给多个人(一),阻止jBPM自动创建任务实例 什么时候节点完成? signal 属性用来控制在什么状态下当前节点结束,流程执行进入下一个节点,北京传智播客教育 ,任务分配给多个人(二),程序动态控制任务实例的创建个数 public void execute(ExecutionContext executionContext) throws Exception TaskMgmtInstance tmi = executio

5、nContext.getTaskMgmtInstance(); TaskNode taskNode = (TaskNode) executionContext.getNode(); / now, 2 task instances are created for the same task. String userIds = (String) executionContext.getContextInstance().getVariable(“userId“); String ids = userIds.split(“,“); for (int i = 0; i ids.length; i+)

6、TaskInstance tia = tmi.createTaskInstance(taskNode.getTask(“mgraudit”), executionContext.getToken(); /必须的加token参数 tia.setActorId(idsi); ,北京传智播客教育 ,swimlane,是流程角色 可以用来实现不同的任务由同一个人来执行的效果 值应或者在定义时确定,或者在运行期引用时获得 可以在start-state节点里添加一个任务,用swimlane机制来记录流程的启动者, . ,北京传智播客教育 ,Pooled Actor,实现任务列表的pull效果 之前我们所采

7、用的都是engine将任务push到某一个actor 也可以将任务先分配给一组用户 一组actors实际上在应用中是属于同一组的用户, “ “,北京传智播客教育 ,Pooled Actor(续),任务最终还是需要某一具体的单个actor来完成 在获取任务时是一种竞争机制 先到先得(actorId应当在pooledActors集合中),List list =jbpmContext.getTaskMgmtSession().findPooledTaskInstances(currentUser); for(int i=0;ilist.size();i+) TaskInstance ti = (Ta

8、skInstance)list.get(i); ti.start(currentUser); /将任务的参与者设置成自己 ,/分配任务 public class PooledActorAssignment implements AssignmentHandler public void assign(Assignable assignable, ExecutionContext executionContext) throws Exception String poolActors = “1“,“2“; assignable.setPooledActors(poolActors); ,北京传智

9、播客教育 ,state 和node节点, 是纯粹的wait节点,除非主动的调用signal,否则一直处于等待状态;比如,和外部系统交互,等待外部系统响应成功之后,在继续process的执行 是用来执行代码的一种节点,我们可以理解为自动节点,无须人工干预,将此类节点建模到流程定义中,是为了表达一些有特殊意义的逻辑(这些逻辑无须人工干预,完全自动运行);比如发送邮件 如果node节点中有action,则需要主动的调用leaveNode方法离开节点,如果节点没有action,将自动结束 需要注意: 程序阻塞 和 状态等待是不同的概念,北京传智播客教育 ,decision节点,路由节点,解决流转的路由

10、问题 有两种处理方法 在流程定义中用decision节点,可以用condition/expression/handler #var #var 10 不在流程定义中进行定义 在建模时,前一个节点有多条transition流出(同前一种方案比,就是少了decision节点) 当前一任务结束时,显式指定transition,北京传智播客教育 ,decision节点(续),需要注意: condition 里面的表达式求值用的是bean shell组件 总是取第一个结果为true的transition作为流转的transition(按在定义中的顺序),如果没有true的存在,则取第一个 也可以在deci

11、sion节点中,利用实现DecisionHandler的类来返回transition的值,public static class LeadEvaluator implements DecisionHandler private static final long serialVersionUID = 1L; public String decide(ExecutionContext executionContext) int budget = (Number)executionContext.getContextInstance().getVariable(“budget“).intValue

12、(); if (budget1000) return “important lead“; else if (budget100) return “lead“; return “beggars“; ,北京传智播客教育 ,fork/join节点,北京传智播客教育 ,fork/join节点 续,特点 用来支持多路分支流转,充分体现业务模型 各个分支可异步执行 如果token(parent token)遇到fork节点,会自动的分裂成多个child token,此时,parent token指向fork节点,child token指向各个分支节点 每次分支的token往前移动时,都会检查是否需要在结束

13、自己的同时也把parent token 往前移动 fork 各个分支上的transition 都必须有名字,否则生成的taskInstance可能不正常; 局限性 对于需要在运行期间创建个数不确定的任务实例的需求,应用程序配合的方式来解决,北京传智播客教育 ,process-state:子流程节点,解决流程嵌套的需求 子流程是一个独立的jBPM流程 需要注意: 主流程和子流程之间的数据传递:mapped-name的值是变量在子流程中名称 父流程和子流程分开部署 如果想让父流程在运行期间才和子流程进行挂接,则需要加binding=“late“ 如果需要在部署期间实现流程耦合,则需要子流程先部署,

14、并注意jbpmContext初始化的位置,北京传智播客教育 ,super-state,用来将一组节点组合在一起,北京传智播客教育 ,action,特点 是java类,用来引入附加的处理逻辑 可以放在node内,也可以放在events中(node-enter) 可以用在多个元素之内,用来辅助当前节点完成业务逻辑 会作为delegate class 事件中的action可以异步执行 async=true,public class YourClass implements ActionHandler public void execute(ExecutionContext executionCont

15、ext) /your code goes here. ,北京传智播客教育 ,event,attribute type 不同的节点支持的事件类型不同,是由event元素所在的node的类型决定的 可以支持action/script/create-timer/cancel-timer 其他,transition 只有一个事件 ,北京传智播客教育 ,Timer-模型,北京传智播客教育 ,Timer-工作要点,在流程定义的节点中加入声明 System.out.println(“here“); 定义在部署时存入数据库表Timer中 理解Business Calendar的涵义 运行时,由Timer ru

16、nner来扫描Timer表执行符合调度条件的Timer逻辑,Timer是job的子类 JobExecutorServlet org.jbpm.job.executor.JobExecutorServlet 1 ,北京传智播客教育 ,Script & Expression,Script Beanshell script Expression Based on JSP EL language (JSTL) It use #,以下变量在Script中可以直接引用: executionContext token node task taskInstance,以下变量在expression环境中可以直接

17、引用: taskInstance processInstance processDefinition token taskMgmtInstance contextInstance,北京传智播客教育 ,TaskController,用户界面到流程实例变量之间的桥梁 任务实例创建的时候从流程实例变量获取变量信息存储到task变量中, 提交任务的时候从task变量写回流程实例变量 实现了流程实例变量和任务实例变量之间的信息传递 同样会被序列化,access:创建任务实例时是否需要从流程实例变量中copy,以及是否需要写回到流程实例变量(任务结束时)以及是否是必须的 mapped-name:在task

18、instance中使用的名字,北京传智播客教育 ,文档管理,基于JCR对文档进行管理 为了解决文档审批过程中,文档的版本及存储问题,北京传智播客教育 ,发邮件,mail action readmylips nomoretaxes mail-node 只能有一个transition元素 ,北京传智播客教育 ,发邮件(续),task 的notify 属性 如果是true,则会自动添加task-assignment时间,在任务分配时触发,会给接收人发邮件【但是感觉目前的代码实现有问题】 Task reminder 依赖于timer,北京传智播客教育 ,添加新的节点类型,在org/jbpm/graph

19、/node/node.types.xml中添加节点信息: 编写自己的节点实现类 主要是覆盖read方法和execute方法,北京传智播客教育 ,需要补充内容一,Delegation class的版本问题: 如何做到delegation class的版本和流程定义的版本相一致呢? 打包上传定义的时候,将类放到classes/目录下面,这样在加载delegation class的时候,会从定义中的fileDefinition中加载(ProcessClassLoader), 注意,系统是先从bootstrap class loader中加载类,如果没有才会加载数据库中的类。,北京传智播客教育 ,需要

20、补充内容二:业务术语,签收 为了标识一个任务实例是否由被分配者执行过 我们可以用taskInstance.start()来实现此功能 会签 多个人对同一个任务进行办理 实际上是一个任务的多个实例由不同的人来完成 传阅 在实际的业务中,表示此任务只需要参与者浏览,而不需要对数据进行操作,从业务的角度有别于会签 【其他】,北京传智播客教育 ,实例练习,目的 体会各种节点的效果和熟悉各种节点的用法 主要涉及到 decision节点 子流程 action node节点,北京传智播客教育 ,流程图示例:主流程,北京传智播客教育 ,子流程:财务处审批,北京传智播客教育 ,练习步骤,编制主流程 将财务处审批定义为单独节点 调试主流程 编制子流程 修改主流程,加入子流程节点 整体调试,北京传智播客教育 ,The End,有问题可以发邮件给我,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1