jBPM5用户手册


翻译 by amos_tl - 1 - jBPMjBPMjBPMjBPM 用户手册 翻译 by amos_tl - 2 - 目录 jBPM 用 户手 册 ...........................................................................................................................- 1 - 第 一章 概述................................................................................................................................- 3 - 第 二章 安装................................................................................................................................- 8 - 第 三章 流程..............................................................................................................................- 10 - 第 四章 BPMN2.0......................................................................................................................- 21 - 第 五章 API................................................................................................................................- 22 - 第 六章 人 工任 务 ......................................................................................................................- 23 - 第 七章 领域- 规 范流 程 .........................................................................................................- 33 - 第 八章 持 久化 ..........................................................................................................................- 34 - 第 九章 控 制台 ..........................................................................................................................- 39 - 第 十章 监视..............................................................................................................................- 42 - 翻译 by amos_tl - 3 - 第一章概述 本章节将介绍 jBPM5 的各种组件。组件将带您快速的了解业务流程的生命 周期和阶段。这些阶段包括建模、部署、执行和监视。 1. 建模 jBPM 允许用户通过图形的方式修改业务流程。用户和开发者可通过三种方 式修改 BPMN2.0 业务流程定义。 1.1. Drools Flow for eclipse 插件 Drools Flow 支持创建,调试流程。 1.2. jBPM5 for eclipse 插件 目前仍在开发中,仅支持创建流程。完成后的版本将完全支持 BPMN2.0 规 范。 1.3. 基于 WEB 的Oryx 编辑器(EXT 实现) Oryx 编辑器整合到 Guvnor,它是一个存储流程的知识库。Oryx 编辑器支 持查看、更新和创建流程。 2. 部署 Guvnor 是一个知识库,用来存储流程、域模型、业务规则等。它提供一个 基于 WEB 的控制台用来查找、修改和测试你的知识库内容。 翻译 by amos_tl - 4 - 3. 执行 3.1. 流程引擎 流程引擎是一个基于 JAVA 语言开发轻量级工作流引擎。 � 内置支持 BPMN 2.0 规范的流程 � 插件化的数据持久层与事务配置 � 审计和历史日志记录 � 基于通用的流程引擎 目前流程引擎还没有实现 BPMN 2.0 所有结点类型与属性,但大部分通用的 结点类型已支持。 下图列出所有 下图列出所有 下图列出所有 下图列出所有 jBPM5 已支持的元素:支持的元素:支持的元素:支持的元素: 翻译 by amos_tl - 5 - 翻译 by amos_tl - 6 - 下面列出所有 下面列出所有 下面列出所有 下面列出所有 BPMN 2.0 定义的元素:的元素:的元素:的元素: 流程对象 事件 * Start Event (None, Conditional, Signal, Message, Timer) * End Event (None, Terminate, Error, Escalation, Signal, Message, Compensation) * IntermediateIntermediateIntermediateIntermediate CatchCatchCatchCatch EventEventEventEvent (Signal,(Signal,(Signal,(Signal, Timer,Timer,Timer,Timer, Conditional,Conditional,Conditional,Conditional, Message)Message)Message)Message) 立 即捕获事件 立 即捕获事件 立 即捕获事件 立 即捕获事件 * IntermediateIntermediateIntermediateIntermediate ThrowThrowThrowThrow EventEventEventEvent (None,(None,(None,(None, Signal,Signal,Signal,Signal, Escalation,Escalation,Escalation,Escalation, Message,Message,Message,Message, Compensation)Compensation)Compensation)Compensation) * Non-interruptingNon-interruptingNon-interruptingNon-interrupting BoundaryBoundaryBoundaryBoundary EventEventEventEvent (Escalation,(Escalation,(Escalation,(Escalation, Timer)Timer)Timer)Timer) 非 中断边界事件 非 中断边界事件 非 中断边界事件 非 中断边界事件 * InterruptingInterruptingInterruptingInterrupting BoundaryBoundaryBoundaryBoundary EventEventEventEvent (Escalation,(Escalation,(Escalation,(Escalation, Error,Error,Error,Error, Timer,Timer,Timer,Timer, Compensation)Compensation)Compensation)Compensation) 活动 * Script Task (Java 、MVEL) JAVA JAVA JAVA JAVA 或或或或MVEL MVEL MVEL MVEL 脚 本表达式语言 脚 本表达式语言 脚 本表达式语言 脚 本表达式语言 * TaskTaskTaskTask * Service Task * User Task * BusinessBusinessBusinessBusiness RuleRuleRuleRule TaskTaskTaskTask * ManualManualManualManual TaskTaskTaskTask * SendSendSendSend TaskTaskTaskTask * ReceiveReceiveReceiveReceive TaskTaskTaskTask * Reusable Sub-Process (Call Activity) 可 复用的子流程 可 复用的子流程 可 复用的子流程 可 复用的子流程 * Embedded Sub-Process 嵌 入的子流程 嵌 入的子流程 嵌 入的子流程 嵌 入的子流程 * Ad-HocAd-HocAd-HocAd-Hoc Sub-ProcessSub-ProcessSub-ProcessSub-Process 点 对点的子流程 点 对点的子流程 点 对点的子流程 点 对点的子流程 * Data-ObjectData-ObjectData-ObjectData-Object 关口 * 分支 * Exclusive (Java, MVEL or XPath expression language) 排斥 * Inclusive (Java, MVEL or XPath expression language) 包含 * Parallel 并行 * Event-Based * 合并 * Exclusive 排斥 * Parallel 并行 * Lanes 数据 * Java type language * Process properties * Embedded Sub-Process properties * 活动 properties 连接对象 * Sequence flow 时序流 翻译 by amos_tl - 7 - 3.2. 人工任务服务 WS-HT 人工任务服务是 BPM 业务流程管理的解决方案一个重要组成部分。 某些任 务可以自动执行而不需要与人交互,但有些任务需要与人交互。jBPM5 中的 actors 代表人的抽象,也就是说不一定是人,可以是阿猫阿狗。jBPM5 默认 提供了一个与 actors 交互的实现,WS-HT。WS-HT 也支持组设置,升级, 分配规则等。 3.3. 监视 流程监听器 Process listeners 可监听流程引擎运行时环境发生的各种事件,如 流程实例启动、结点实例完成等。这些信息可用来创建历史日志进行报表静 态分析或供 BAM 业务活动监控进行动态分析。 3.3.1.基于 WEB 的流程管理控制台 http://localhost:8080/jbpm-console 用 户名 /密 码: krisv/krisv 通 过此 控制 台可 以管 理流 程实 例 。进 入流 程 Overview可 以启 动流 程 ,查 看流 程 , 停 止流 程。 进入 个人 任务 可以 进行 流程 操作 。进 入报 表可 以查 看流 程报 表。 翻译 by amos_tl - 8 - 第二章安装 参考 http://w26.iteye.com/blog/998431 Guvnor 的使用: http://localhost:8080/drools-guvnor 使用视频: http://people.redhat.com/kverlaen/install-guvnor-jbpm.swf 若有安装问题,可这样子: Email: jbpm-dev@lists.jboss.org IRC:#jbpm at irc.codehaus.org jBPM 用户论坛 http://community.jboss.org/en/jbpm?view=discussions FAQ: 1. 脚本不能下载组件? 检查网络,或直接手动下载后放到 jbpm-installer/lib 文件夹。 2. 下载的组件不能解压? 文件有问题,重新下载。 翻译 by amos_tl - 9 - 3. 清除安装? ant clean.demo 4. 重新启动报异常? 手动人工服务结束进程,再重新启动。这是脚本缺陷导致的。 5. 控制台或 Guvroy 报错? 检查${jboss.home}/server/default/log。如不能解决,发到论坛。 翻译 by amos_tl - 10 - 第三章流程 � 业务流程是一张流程图表,描述一系列执行步骤的顺序。它由多个结点 组成,结点之间互相连接。 � 结点代表总流程的一个步骤, � 箭头代表结点之间的连接,它指定如何从一个结点流向另外一个结点。 � BMPN2.0 已经预定义了一组结点元素。 本章节介绍如何定义和使用结点。 1. 创建流程 创建流程有三种方式: � Eclipse BPMN2.0 图形编辑器插件 � 文本编辑器 � 直接创建通过流程 API 流程文件扩展名:bpmn bpmn2。 翻译 by amos_tl - 11 - 图形编辑器插件需要打开属性面板配置元素属性。 XML 形式: -->-->--> />/>/> >>> World");World");World"); >>> -->-->--> />/>/> />/>/> 翻译 by amos_tl - 12 - API 方式: 为了屏蔽内部 API,不推荐使用。 重要的流程已经定义在org.jbpm.workflow.core 和 org.jbpm.workflow.core.node 包中。你可以通过工厂来创建流程。示例在 源 码包的 junit tests 中。 package org.jbpm.process; import org.jbpm.JbpmTestCase; import org.jbpm.ruleflow.core.RuleFlowProcessFactory; public class ProcessFactoryTest extends JbpmTestCase { public void testProcessFactory() { RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("org.drools.process"); factory // header .name("My process").packageName("org.drools") // nodes .startNode(1).name("Start").done() .actionNode(2).name("Action") .action("java", "System.out.println(\"Action\");").done() .endNode(3).name("End").done() // connections .connection(1, 2) .connection(2, 3); factory.validate().getProcess(); 翻译 by amos_tl - 13 - } } 更多代码: http://github.com/krisv/jbpm/tree/master/jbpm-bpmn2/src/test/resources/ 2. 使用流程 2.1. 创建知识库 KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource("MyProcess.bpmn2"), ResourceType.BPMN2 ); KnowledgeBase kbase = kbuilder.newKnowledgeBase(); 2.2. 创建会话启动流程 流程启动需要显式调用 startProcess 方法。 StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.startProcess("com.sample.hello"); 参数 com.sample.hello 代表流程 ID。 startProcess(String processId, Map parameters) 方法的 Map 参数可传入额外 的参数,这些参数是键值对。注意这些参数将被复制到流程实例,作为流程 的顶级变量。顶级变量是指变量的作用或是顶级的。 2.3. 结点类型的细节解释 流程有如下属性:流程有如下属性:流程有如下属性:流程有如下属性: ID: 惟一 NAME: 显示名称 VERSION: 版本 Package: 命名空间 Variables: 变量,用于传递数据 Swimlanes: 泳道(专用通道),指定执行人工任务的 actor Connection Layout 连接布局 Manual : 人工 Shortest path : 最短路径 翻译 by amos_tl - 14 - Manhattan : 曼哈顿 BMPNBMPNBMPNBMPN 支持结点类型如下:支持结点类型如下:支持结点类型如下:支持结点类型如下: 翻译 by amos_tl - 15 - 翻译 by amos_tl - 16 - 开始事件与结束事件开始事件与结束事件开始事件与结束事件开始事件与结束事件, 一个流程必须有一个开始事件,一个或多个结束事 件。结束事件的 Terminate 如果为TRUE,那么将结束整个流程,否则若 有多个结束事件只会结束对应结束事件的路径。如 T2-E2. | - T1 - E1(Terminate=false) S- + | - T2 - E2(Terminate=false) RuleRuleRuleRule TaskTaskTaskTask 代表需要执行一组规则集。规则定义在多个分离的文件中,格式 要求为 Drools rule format。规则可以成为标准规则流组的一部分通过在头部使 用ruleflow-group 属性。 ruleflow-group 的执行可认为是一个队列。新来的必须等前面的执行完才会 执行。 DivergingDivergingDivergingDiverging GatewayGatewayGatewayGateway 分支结点,一进多出。GatewayGatewayGatewayGateway 不好翻译,所以省略。 AND parallel 与,并行, 两个都要满足(同步) XOR or exclusive 异或,排斥,只选择其中一个 OR or inclusive 或,包含,至少只要有一个满足即可(不同步) ConvergingConvergingConvergingConverging GatewayGatewayGatewayGateway 合并结点,多进一出。 AND parallel 与,并行, 两个都要满足(同步) 翻译 by amos_tl - 17 - XOR or exclusive 异或,排斥,只选择其中一个 ReusableReusableReusableReusable Sub-ProcessSub-ProcessSub-ProcessSub-Process 可复用子流程 Wait for completion 等待完成 On-entry and on-exit actions:绑定入口与出品 action. Parameter in/out mapping: in 表示输入参数 out 表示输入参数和返回, 只有当 Wait for completion 为true 时,out 才可以使用。 ScriptScriptScriptScript TaskTaskTaskTask 代表一个可执行的脚本。支持 Java ,MVEL 方言。脚本绑定 到Action. Action: 绑定的 Action. TimerTimerTimerTimer EventEventEventEvent 定时器事件 Timer delay 延迟时间 ms ErrorErrorErrorError EventEventEventEvent 异常事件 FaultName 异常处理器名 FaultVariable 异常变量 .Message.Message.Message.Message EventEventEventEvent 消息事件, 没有输入 EventType 监听事件类型 翻译 by amos_tl - 18 - VariableName 事件数据 Scope internal 流程内部事件 external 外部事件 .User.User.User.User TaskTaskTaskTask 用户任务(人工任务) ActorId 责任人,多个人用逗号“,”分隔 GroupId 组,多个组用逗号“,”分隔 Skippable 表示这个任务是否可忽略,即不执行就结束。 Swimlane 泳道 On.entry /on-exit actions: 绑定入口、出口 Action Parameter mapping 传入参数 Result mapping 返回结果 Content: 任务数据 .Sub-Process.Sub-Process.Sub-Process.Sub-Process 子流程 .Multiple.Multiple.Multiple.Multiple InstancesInstancesInstancesInstances 多实例子流程,特殊的子流程,允许执行多次 ServiceServiceServiceService TaskTaskTaskTask((((WorkWorkWorkWork ItemItemItemItem nodenodenodenode))))代表一个抽象的任务。可通过它扩展任务。 Additional parameters 扩展参数定义 DataDataDataData 变量,顶级、子级,继承树 翻译 by amos_tl - 19 - 约束:包括代码约束和规则约束 ActionsActionsActionsActions Action 可以访问全局,流程变量,知识库上下文预定义变量,访问运行 时,启动流程,分发事件,插入数据。 EventsEventsEventsEvents 事件类型 - 事件监听(消息事件) - 事件处理(action) 事件分发: 内部事件 流程管理 外部事件 action TimersTimersTimersTimers 定时器 更新流程更新流程更新流程更新流程 // create the session and start the process "com.sample.process" KnowledgeBuilder kbuilder = ... StatefulKnowledgeSession ksession = ... ProcessInstance processInstance = ksession.startProcess("com.sample.process"); // add a new version of the process "com.sample.process2" kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add(..., ResourceType.BPMN2); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); // migrate process instance to new version Map mapping = new HashMap(); // top level node 2 is mapped to a new node with id 3 mapping.put("2", 3L); // node 2, which is part of composite node 5, is mapped to a new node with id 4 翻译 by amos_tl - 20 - mapping.put("5.2", 4L); WorkflowProcessInstanceUpgrader.upgradeProcessInstance( ksession, processInstance.getId(), "com.sample.process2", mapping); 翻译 by amos_tl - 21 - 第四章BPMN2.0BPMN2.0BPMN2.0BPMN2.0 目前 jBPM5 没有完全实现 BPMN2.0 规范。因此本章略过。 翻译 by amos_tl - 22 - 第五章APIAPIAPIAPI 本章是代码,前面已经贴过,不再多说。讲解了知识库、会话、流程的关系 及如何创建。 翻译 by amos_tl - 23 - 第六章人工任务 人工任务规范 http://download.boulder.ibm.com/ibmdl/pub/software/dw/specs/ws-bpel4people/WS-HumanTask_ v1.pdf jBPM5 使用UserTask 结点表示人工任务(需要与 actor 交互的任务)。 UserTask 任务结点支持定义任务类型、actors 和任务关联的数据。通过 Task Service 可管理 UserTask。 为了使用人工任务,你必须定义 UserTask 结点。一个 UserTask 表示一个需 要 actor 执行的自动化任务。人工任务其实可以简单认为是任何类型的外部服务。 外部服务需要被调用,可看成特殊类型的 work item 实现。 人工任务惟一的特色是支持泳道来简化给用户分配任务。 UserTask 结点属性: * Id: 结点惟一标识 * Name: 结点名称 * TaskName: 任务名称 翻译 by amos_tl - 24 - * Priority: 优先级(整数) * Comment: 任务注释 * ActorId: actor, 多个使用逗号","分隔 * Skippable: 任务可跳过(不执行就结束) * Content: 任务关联的数据 * Swimlane: 泳道,可以简化分配多个人工任务给同一个 actor * Wait for completion: 是否等待人工任务执行完成,若为 False,则创 建完人工任务后继续流程。 * On-entry and on-exit actions: 绑定入口、出品事件处理器-action * Parameter mapping: 参数 * Result mapping: 结果 * Timers: 定时器 * ParentId: 父人工服务 ID 1. 泳道 说明:这个译法对于大家来讲,不明白怎么回事?但名词而已,纯靠前辈误导,慢慢误导就理解了 。 使用泳道前必须在流程定义属性流程定义属性流程定义属性流程定义属性中配置泳道的集合。 多个人工任务使用同一泳道,第一个人工任务执行时,将会指定一个 actorId. 后面的人工任务即使显式指定 actorId,,也不会起作用,而是使用第一个人工任 务的 actorId。当然我们使用泳道就没必要再指定 actorId,第一个除外。 试想,有这样一个场景,公司有 试想,有这样一个场景,公司有 试想,有这样一个场景,公司有 试想,有这样一个场景,公司有 2222个部门,个部门,个部门,个部门,HRHRHRHR部与部与部与部与ITITITIT部;流程定义了 部;流程定义了 部;流程定义了 部;流程定义了 2222个泳道 个泳道 个泳道 个泳道 HRHRHRHR、、、、 ITITITIT;;;;流程定义中包含 流程定义中包含 流程定义中包含 流程定义中包含 4444个人工任务个人工任务个人工任务个人工任务,,,,前两个人工任务需要与 前两个人工任务需要与 前两个人工任务需要与 前两个人工任务需要与 HRHRHRHR部经理交互部经理交互部经理交互部经理交互,,,,后两个人工任后两个人工任后两个人工任后两个人工任 务需要与 务需要与 务需要与 务需要与 ITITITIT部经理交互。当我们指定前两个人工任务的 部经理交互。当我们指定前两个人工任务的 部经理交互。当我们指定前两个人工任务的 部经理交互。当我们指定前两个人工任务的 actorIdactorIdactorIdactorId 时,需要分配两次。后面时,需要分配两次。后面时,需要分配两次。后面时,需要分配两次。后面 两个也是如此两个也是如此两个也是如此两个也是如此。。。。现在极端情况发生了现在极端情况发生了现在极端情况发生了现在极端情况发生了,,,,HRHRHRHR经理与 经理与 经理与 经理与 HTHTHTHT经理调岗经理调岗经理调岗经理调岗,,,,我们是不是得去修改流程我们是不是得去修改流程我们是不是得去修改流程我们是不是得去修改流程 翻译 by amos_tl - 25 - 定义下所有人工服务的 定义下所有人工服务的 定义下所有人工服务的 定义下所有人工服务的 actorId?actorId?actorId?actorId?而通过使用泳道,只需要修改第一个和第三个的 而通过使用泳道,只需要修改第一个和第三个的 而通过使用泳道,只需要修改第一个和第三个的 而通过使用泳道,只需要修改第一个和第三个的 actorIdactorIdactorIdactorId。。。。 泳道与 actorId 是一对多的关系,也就是说,一个人工任务可指定给多个 actor 来处理。 泳道的实质是什么,实质就是把人工任务进行分类,并绑定 actor 列表。 2. 人工任务管理组件 人工任务与其它外部服务类似,可作为 work itme 的扩展被实现和调用。流程仅 包含人工任务执行所必要的抽象描述。 work item handler 是这个抽象描述的标 准实现。用户使用我们可拔插的 work item handler 方式完成底层的实现。 我们也提供了一个 WS-HumanTask 规范的管理组件。通过它来管理任务的生命 周期(创建,获取,完成,任务状态持久化)。同时也支持国际化、日历、各种 分配类型,代理和生死线。 3. 人工任务生命周期 翻译 by amos_tl - 26 - 当一个流程实例的人工任务结点被触发,人工任务实例将被创建。当创建完成后, 人工任务进入 Created 状态。 当人工任务的 Wait for completion 属性为 False 时,流程会立即继续执行,否 则要等待任务完成或终止。 进入 Created 状态,任务将显示所有负责执行的 actors。等待他们来获取任务。 一旦有一个 actor 获取任务,任务进入 Reserved 状态。用户决定开始执行任务, 此时任务进入 InProgress 状态。任务开始执行,执行完成后,用户必须完成任 翻译 by amos_tl - 27 - 务。此时用户进入 Completed 状态。用户也可以决定任务已经失败,此时任务 进入 Failed 状态。 上面介绍的正常的生命周期,其它包括: Delegating /forwarding 任务, 分配任务给另外一个 actor 来处理 Revoking 回滚任务 Temporarly suspending and resuming 临时挂起或继续任务 Stopping a task in progress 停止正在执行的任务 Skipping 跳过(不执行) 4. 链接人工任务管理组件和引擎 4.1. 注册 work item handler work item handler 的功能是翻译抽象的 work item(如人工任务) 为规范的调用。 我们已经实现了个 work item handler ,它在包 jbpm-human-task 中: org.jbpm.process.workitem.wsht.WSHumanTaskHandler 注册代码示例: StatefulKnowledgeSession ksession = ...; ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new WSHumanTaskHandler()); 翻译 by amos_tl - 28 - 若需要持久化会话内容,应该使用 org.jbpm.process.workitem.wsht.CommandBasedWSHumanTaskHandler 它们都默认使用 Mina 来提供 C/S 通信传输。 http://mina.apache.org 更快速的实现 HornetQ 也是可行的。 人工任务客户端使用如下的生命周期管理方法: 5. 启动人工任务管理组件 前提: 数据表 users ,groups 中数据已经配置好。你可能通过如下代码来添加用户和 组: taskSession.addUser(user) taskSession.addGroup(group) 确保数据库相关表中至少有一个 Administrator 用户和 administrator 角色。我 们提供的 evaluation 评审示例中会自动加载两个用户和组配置文件: jbpm-installer\task-service\resources\org\jbpm\ LoadUsers.mvel 翻译 by amos_tl - 29 - LoadGroups.mvel 启动任务管理组件示例: EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.task"); TaskService taskService = new TaskService(emf, SystemEventListenerFactory.getSystemEventListener()); MinaTaskServer server = new MinaTaskServer( taskService ); Thread thread = new Thread( server ); thread.start(); 任务管理组件使用 JPA 来存储任务数据,因此需要配置 persistence.xml 下面是任务管理组件使用 Hibernate 和 H2 数据库存的示例: org.hibernate.ejb.HibernatePersistence org.jbpm.task.Attachment org.jbpm.task.Content org.jbpm.task.BooleanExpression org.jbpm.task.Comment org.jbpm.task.Deadline org.jbpm.task.Comment org.jbpm.task.Deadline org.jbpm.task.Delegation org.jbpm.task.Escalation org.jbpm.task.Group org.jbpm.task.I18NText org.jbpm.task.Notification org.jbpm.task.EmailNotification 翻译 by amos_tl - 30 - org.jbpm.task.EmailNotificationHeader org.jbpm.task.PeopleAssignments org.jbpm.task.Reassignment org.jbpm.task.Status org.jbpm.task.Task org.jbpm.task.TaskData org.jbpm.task.SubTasksStrategy org.jbpm.task.OnParentAbortAllSubTasksEndStrategy org.jbpm.task.OnAllSubTasksEndParentEndStrategy org.jbpm.task.User H2数据库实际上是 hsqldb 2.0+ 版本. 你也可以通过jbpm-human-task 源码包 src/test/java 目录下的 org.jbpm.task.RunTaskService 类来启动任务服务器,它会自动加载 LoadUsers.mvel 和 LoadGroups.mvel 配置文件 。 6. 与任务管理组件交互 最终用户不可能直接通过底层 AP来管理任务,因此开发者需要使用 API来实现 与任务管理组件交互。 翻译 by amos_tl - 31 - 示例: TaskClient client = new TaskClient(new MinaTaskClientConnector("client 1", new MinaTaskClientHandler(SystemEventListenerFactory.getSystemEventListener()))); client.connect("127.0.0.1", 9123); //////// addingaddingaddingadding aaaa tasktasktasktask BlockingAddTaskResponseHandler addTaskResponseHandler = new BlockingAddTaskResponseHandler(); Task task = ...; client.addTask( task, null, addTaskResponseHandler ); long taskId = addTaskResponseHandler.getTaskId(); //////// gettinggettinggettinggetting taskstaskstaskstasks forforforfor useruseruseruser "bobba""bobba""bobba""bobba" BlockingTaskSummaryResponseHandler taskSummaryResponseHandler = new BlockingTaskSummaryResponseHandler(); client.getTasksAssignedAsPotentialOwner("bobba", "en-UK", taskSummaryResponseHandler); List tasks = taskSummaryResponseHandler.getResults(); //////// startingstartingstartingstarting aaaa tasktasktasktask BlockingTaskOperationResponseHandler responseHandler = new BlockingTaskOperationResponseHandler(); client.start( taskId, "bobba", responseHandler ); //////// completingcompletingcompletingcompleting aaaa tasktasktasktask responseHandler = new BlockingTaskOperationResponseHandler(); client.complete( taskId, users.get( "bobba" ).getId(), null, responseHandler ); 7. 人工任务管理接口 1111))))EclipseEclipseEclipseEclipse 插件插件插件插件 配置 URL、端口: Window -> Preferences and select Drools Task 翻译 by amos_tl - 32 - 127.0.0.1:9123 2222)基于 )基于 )基于 )基于 WEB WEB WEB WEB 的控制台的控制台的控制台的控制台 第七章领域---- 规范流程 本章讲解如何开发领域规范流程服务-邮件通知。这个示例应该自己去动手 实践。 不翻译的原因是让英文有难度的尝试去挑战下,其实并没有想象的这么难。 而且内容也不是很多。 翻译 by amos_tl - 33 - 第八章持久化 jBPM5 允许持久存储一些信息,如流程运行时状态、历史信息等。 1. 运行时状态 jBPM 支持插件化的持久策略。jBPM 默认不会持久化流程运行时状态。运行时 流程实例仅包含执行所必要的信息,不包括历史信息。 翻译 by amos_tl - 34 - jBPM 支持 binary persistence mechanism 二进制数据的持久机制。 Safe Points 安全点,当流程从一个状态转换到另个状态,叫做安全点,它将触化 流程和受其影响的其他流程进行持久化。 2. 配置持久化 使用Hibernate 来作为 JPA持久层的实现和 H2 数据库,你也可以选择其它方 案。 1)配置依赖包1)配置依赖包1)配置依赖包1)配置依赖包 Drools runtime 其它: 1. jbpm-persistence-jpa (org.jbpm) 2. drools-persistence-jpa (org.drools) 3. persistence-api (javax.persistence) 4. hibernate-entitymanager (org.hibernate) 5. hibernate-annotations (org.hibernate) 6. hibernate-commons-annotations (org.hibernate) 7. hibernate-core (org.hibernate) 8. dom4j (dom4j) 9. jta (javax.transaction) 10.btm (org.codehaus.btm) 11.javassist (javassist) 12.slf4j-api (org.slf4j) 13.slf4j-jdk14 (org.slf4j) 14.h2 (com.h2database) 15.commons-collections (commons-collections) 2)配置引擎2)配置引擎2)配置引擎2)配置引擎 //////// createcreatecreatecreate thethethethe entityentityentityentity managermanagermanagermanager factoryfactoryfactoryfactory andandandand registerregisterregisterregister itititit inininin thethethethe environmentenvironmentenvironmentenvironment EntityManagerFactoryEntityManagerFactoryEntityManagerFactoryEntityManagerFactory emfemfemfemf ==== Persistence.createEntityManagerFactory(Persistence.createEntityManagerFactory(Persistence.createEntityManagerFactory(Persistence.createEntityManagerFactory( "org.jbpm.persistence.jpa""org.jbpm.persistence.jpa""org.jbpm.persistence.jpa""org.jbpm.persistence.jpa" );););); EnvironmentEnvironmentEnvironmentEnvironment envenvenvenv ==== KnowledgeBaseFactory.newEnvironment();KnowledgeBaseFactory.newEnvironment();KnowledgeBaseFactory.newEnvironment();KnowledgeBaseFactory.newEnvironment(); env.set(env.set(env.set(env.set( EnvironmentName.ENTITY_MANAGER_FACTORY,EnvironmentName.ENTITY_MANAGER_FACTORY,EnvironmentName.ENTITY_MANAGER_FACTORY,EnvironmentName.ENTITY_MANAGER_FACTORY, emfemfemfemf );););); //////// createcreatecreatecreate aaaa newnewnewnew knowledgeknowledgeknowledgeknowledge sessionsessionsessionsession thatthatthatthat usesusesusesuses JPAJPAJPAJPA totototo storestorestorestore thethethethe runtimeruntimeruntimeruntime statestatestatestate StatefulKnowledgeSessionStatefulKnowledgeSessionStatefulKnowledgeSessionStatefulKnowledgeSession ksessionksessionksessionksession ==== JPAKnowledgeService.newStatefulKnowledgeSession(JPAKnowledgeService.newStatefulKnowledgeSession(JPAKnowledgeService.newStatefulKnowledgeSession(JPAKnowledgeService.newStatefulKnowledgeSession( kbase,kbase,kbase,kbase, null,null,null,null, envenvenvenv );););); 翻译 by amos_tl - 35 - intintintint sessionIdsessionIdsessionIdsessionId ==== ksession.getId();ksession.getId();ksession.getId();ksession.getId(); //////// invokeinvokeinvokeinvoke methodsmethodsmethodsmethods onononon youryouryouryour methodmethodmethodmethod herehereherehere ksession.startProcess(ksession.startProcess(ksession.startProcess(ksession.startProcess( "MyProcess""MyProcess""MyProcess""MyProcess" );););); ksession.dispose();ksession.dispose();ksession.dispose();ksession.dispose(); 重新创建 重新创建 重新创建 重新创建 SessionSessionSessionSession //////// recreaterecreaterecreaterecreate thethethethe sessionsessionsessionsession fromfromfromfrom databasedatabasedatabasedatabase usingusingusingusing thethethethe sessionIdsessionIdsessionIdsessionId ksessionksessionksessionksession ==== JPAKnowledgeService.loadStatefulKnowledgeSession(JPAKnowledgeService.loadStatefulKnowledgeSession(JPAKnowledgeService.loadStatefulKnowledgeSession(JPAKnowledgeService.loadStatefulKnowledgeSession( sessionId,sessionId,sessionId,sessionId, kbase,kbase,kbase,kbase, null,null,null,null, envenvenvenv );););); 3)3)3)3) 配置 配置 配置 配置 persistence.xmlpersistence.xmlpersistence.xmlpersistence.xml name="org.jbpm.persistence.jpa">name="org.jbpm.persistence.jpa">name="org.jbpm.persistence.jpa"> org.hibernate.ejb.HibernatePersistenceorg.hibernate.ejb.HibernatePersistenceorg.hibernate.ejb.HibernatePersistenceorg.hibernate.ejb.HibernatePersistence jdbc/processInstanceDSjdbc/processInstanceDSjdbc/processInstanceDSjdbc/processInstanceDS org.drools.persistence.session.SessionInfoorg.drools.persistence.session.SessionInfoorg.drools.persistence.session.SessionInfoorg.drools.persistence.session.SessionInfo org.jbpm.persistence.processinstance.ProcessInstanceInfoorg.jbpm.persistence.processinstance.ProcessInstanceInfoorg.jbpm.persistence.processinstance.ProcessInstanceInfoorg.jbpm.persistence.processinstance.ProcessInstanceInfo org.jbpm.persistence.processinstance.WorkItemInfoorg.jbpm.persistence.processinstance.WorkItemInfoorg.jbpm.persistence.processinstance.WorkItemInfoorg.jbpm.persistence.processinstance.WorkItemInfo value="org.hibernate.dialect.H2Dialect"/>value="org.hibernate.dialect.H2Dialect"/>value="org.hibernate.dialect.H2Dialect"/> value="3"/>value="3"/>value="3"/> value="update"/>value="update"/>value="update"/> value="true"/>value="true"/>value="true"/> value="org.hibernate.transaction.BTMTransactionManagerLookup"/>value="org.hibernate.transaction.BTMTransactionManagerLookup"/>value="org.hibernate.transaction.BTMTransactionManagerLookup"/> 部署到包的 META-INF 目录 翻译 by amos_tl - 36 - 4)配置数据源 4)配置数据源 4)配置数据源 4)配置数据源 h2.dsh2.dsh2.dsh2.ds jdbc/testDS1 jdbc:h2:file:/NotBackedUp/data/process-instance-db org.h2.jdbcx.JdbcDataSource sa sasa 5)配置事务边界5)配置事务边界5)配置事务边界5)配置事务边界 1. 每个请求一个事务,默认行为。 2. 自定义事务 // create the entity manager factory and register it in the environment EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.jbpm.persistence.jpa" ); Environment env = KnowledgeBaseFactory.newEnvironment(); env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf ); env.set( EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager() ); // create a new knowledge session that uses JPA to store the runtime state StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env ); // start the transaction UserTransaction ut = (UserTransaction) new InitialContext().lookup( "java:comp/UserTransaction" ); ut.begin(); // perform multiple commands inside one transaction ksession.insert( new Person( "John Doe" )); ksession.startProcess( "MyProcess" ); // commit the transaction ut.commit(); 3. 历史日志 历史运行日志是引擎执行时基于事件生成。 翻译 by amos_tl - 37 - jbpm-bam 模板包含事件监听器和存储流程相关的信息到数据库。 数据库包含两张表: ProcessInstanceLog: 包括流程实例 ID, 流程定义 ID, 流程实例的开始结束 时间 NodeInstanceLog:流程实例的节点为执行信息。 启用历史日志启用历史日志启用历史日志启用历史日志 StatefulKnowledgeSession ksession = ...; JPAWorkingMemoryDbLogger logger = new JPAWorkingMemoryDbLogger(ksession); // invoke methods one your session here logger.dispose(); addFilter :过滤日志内容 配置 persistence.xml org.hibernate.ejb.HibernatePersistence jdbc/processInstanceDS org.drools.persistence.session.SessionInfo org.jbpm.persistence.processinstance.ProcessInstanceInfo org.jbpm.persistence.processinstance.WorkItemInfo org.jbpm.process.audit.ProcessInstanceLog org.jbpm.process.audit.NodeInstanceLog org.jbpm.process.audit.VariableInstanceLog 翻译 by amos_tl - 38 - 第九章控制台 http://localhost:8080/jbpm-console krisv/krisv 1. 添加流程/任务表单 表单可以完成流程启动,人工交互。 翻译 by amos_tl - 39 - 通过使用 freemarker 动态创建表单。 创建表单模板{processId}.ftl com.sample.evaluation.ftl 示例:

开始性能评审


enctype="multipart/form-data">enctype="multipart/form-data">enctype="multipart/form-data"> 用户名:
创建任务表单模板{taskName}.ftl Performance Evaluation.ftl 示例:

员工评审


${task.descriptions[0].text}${task.descriptions[0].text}${task.descriptions[0].text}${task.descriptions[0].text}

评审意见:
总体性能:

可用性:
初步可显示
健壮
通信能力好

翻译 by amos_tl - 40 -
表单提交的数据将添加参结果参数 MAP。 注意,JBOSS WAR 应用 LIB 目录需要 jbpm-gwt-form.jar jbpm-gwt-form.jar jbpm-gwt-form.jar jbpm-gwt-form.jar 包。 2. REST 接口 查看暴露的 REST 接口 http://localhost:8080/gwt-console-server/rs/server/resources 示例: 关闭任务 http://localhost:8080/gwt-console-server/rs/task/{taskId}/close 启动流程实例 http://localhost:8080/gwt-console-server/rs/process/definition/${id}/new_insta nce http://localhost:8080/gwt-console-server/rs/process/definition/2/new_instance 查看流程实例 http://localhost:8080/gwt-console-server/rs/process/definition/com.sample.eval uation/instances 翻译 by amos_tl - 41 - 获取数据集 http://localhost:8080/gwt-console-server/rs/process/instance/${id}/dataset http://localhost:8080/gwt-console-server/rs/process/instance/1/dataset 第十章监视 1. 报表 通过使用 BIRT 报表来定义数据集、创建报表、包含报表、预览报表和导出报表。 数据集一般是流程的历史日志,也可添加其他数据源。 翻译 by amos_tl - 42 - 1. 直接介入 通过 CEP 复杂事件处理 和 MVEL 脚本来动态监视流程。 示例: declare ProcessStartedEvent @role( event ) end dialect "mvel" rule "Number of process instances above threshold" when Number( nbProcesses : intValue > 1000 ) from accumulate( e: ProcessStartedEvent( processInstance.processId == "com.sample.order.OrderProcess" ) over window:size(1h), count(e) ) then System.err.println( "WARNING: Number of order processes in the last hour above 1000: " + nbProcesses ); end
还剩41页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 16 金币 [ 分享pdf获得金币 ] 7 人已下载

下载pdf

pdf贡献者

wangxulib

贡献于2011-11-02

下载需要 16 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf