收藏 分享(赏)

将 Fire Workflow 嵌入你自己的系统中.pdf

上传人:weiwoduzun 文档编号:5643056 上传时间:2019-03-10 格式:PDF 页数:26 大小:590.08KB
下载 相关 举报
将 Fire Workflow 嵌入你自己的系统中.pdf_第1页
第1页 / 共26页
将 Fire Workflow 嵌入你自己的系统中.pdf_第2页
第2页 / 共26页
将 Fire Workflow 嵌入你自己的系统中.pdf_第3页
第3页 / 共26页
将 Fire Workflow 嵌入你自己的系统中.pdf_第4页
第4页 / 共26页
将 Fire Workflow 嵌入你自己的系统中.pdf_第5页
第5页 / 共26页
点击查看更多>>
资源描述

1、、 4_将 FireWorkflow嵌入 你 自己 的 系统 中作者 :非 也 Q: 20674450Em ail: 目 录1.阅读 指南 及注 意事 项 .22.FireWorkflow就是 两个 jar包和 7张表 .21)Jar包 .22)表结 构 33)小结 .53.FireWorkflow的对 象 .64)工作 流模 型对 象 .6a.Activty和 Task: 6b.Synchronizer、 StartNode、 EndNode6c.Transiton.6d.各种 模型 对象 (流 程元 素) 的组 成关 系 .6e.各种 流模 型对 象( 程元 素) 的继 承关 系 .75)

2、Engine.8a.Engine的结 构 8b.ngineAPI.104.业务 数据 vs工作 流数 据 11)业务 数据 及工 作流 数据 的划 分和 存储 12)必要 的扩 展 .125.常见 流程 操作在 FireWorkflow中的 实现 .141)创建 流程 实例 、设 置流 程实 例变 量、 自动 完成 第一 个环 节的 工单 162)FireWorkflow的任 务分 配机 制 183)签收 工单 184)完成 工单 206.将 Fireworkflow嵌入 你的 系统 的详 细步 骤 .211)第一 步、 将相 关的 Jar包扔 到你 的项 目中 去 212)第二 步、 创建

3、相关 的表 结构 .223)第三 步、 配置 FireflowContext.xml22a.首先 配置 taskinstancem anager.22b.然后 配置 PersitenceSrvice.22c.注册 流程 定义 文件 224)将工 作流的 hibernate映射 文件 加入到 hibernate映射 文件 列表 中 .235)第五 步、 编码 调用 FireWorkflow247.关于 FireflowExam ple项目 .241)项目 介绍 242)建立 Exam ple的数 据库 表 .243)发布 运行 244)登录 系统 进行 操作 .245)各角 色的 流程 操作 特

4、点 251.阅 读 指 南 及 注 意 事 项本文 所用 示例 、 Engine安装 包、数 据 库脚 本等 等都 在 Fire-Workflow-Engine-AlInOne.rar中。 该发 布包 包含 如下 内容/dist目录 : 包含 Fireworkflow的 org-fireflow-engine.jar和 org-fireflow-m odel.jar, 数 据 库脚本 , FireflowContext.xml。/ireflExam ple:一 个使用 Fireworkflow的 j2ee项目 示例/ThirdPartyLibs: engine所需 的第 三方 支持 包/api

5、_docs: api文档 (暂缺 2009-02-05)/src:引 擎和 Model的源 代码我建议你按照章节顺序阅读可能对 Fireworkflow的理解更加深入,如果一开始就扎进第 6章会 不知 所云 。2.FireWorkflow就 是 两 个 jar包 和 7张 表1)Jar包包包包如果 不考 虑流 程设 计器 , 那么 FireWorkflow和 hibernate或者 spring一样 , 都 是 几个 jar包而已。唯一的区别是, FireWorkflow还附带了几张表,用于记录流程流转过程中的一些状态 。 FireWorkflow的 jar包如 下表FireWorkflow还

6、需 要如 下第 三方 支持 包名 称 用 途org-fireflow-m odel.jar 工作 流模 型部 分,例如 WorkflowProces,Activty,Task,Synchronizer等等 静态 对象 都在 该包 中。org-fireflow-engine.jar 工作 流引 擎部 分,例如 ProcesInstance, ActivtyInstance,TaskInstance等等 动态 对象 及其 驱动 算法 都在 该包 中。名 称 用 途spring-core.jar, spring-context.jar,spring-beans.jar Spring相 关 的 jar

7、包 。 FireWorkflow的 Engine的各 种服 务是 通过 SpringIOC容器 组装 在一 起的 。这是缺省的组装方式,实际上你也可以写一个Factory将 Engine组装 起来 ,或 者 用其 他的 IOC容 器进行 组装 。2)表结构表结构表结构表结构FireWorkflow的后 台表 结构 如下你或 许 有 点 困 惑 , 为 什 么 没 有 见 到 ActivtyInstance之类 的 表 呢 ? 在 FireWorkflow中 ,将 StartNodeInstance, ActivtyInstance, SynchronizerInstance, EndNodeI

8、nstance,TransitonInstance等当 作内 核的 对象 , 内 核 的对 象是 所有 流程 实例 共享 的无 状态 的对 象, 不需要持 久化 。这 样设 计的 目的 之一 是减 少后 台表 的数 量, 相较 于 JBPM的 30多 张 后 台 表 ,FireWorkflow是非 常苗 条的 。Fireworkflow表结 构的 关系 如下 图。dom4j.jar 用于 流程 定义 文件 的解 析comm ons-logging.jar, log4j.jar 用于 日志comm ons-jexl-1.1.jar 用于 计算 转移 条件的 EL表达 式comm ons-bean

9、utils-1.6.1.jar 用于 javBean的拷 贝Hibernate相关的 jar包 缺省 情 况 下 , engine通过 hibernate进行 持 久 化操作 。名 称 用 途T_F_DF_WORKFLOWDEF 存储流 程定 义文 件。 在 Fireworkflow中,流程运行 时的 表不 需要 和流 程定 义表 做关 联,因 此 没有 将流程 定义 文件 分解 ,直 接存 为一 个大 字段 。T_F_RT_PROCESINSTANCE流程 实例 表_PIT_VR 流程 变量 表T_F_RT_TASKINSANCE 任务 实例 表_WORITEM 工单 表T_F_RT_TKE

10、N Token表,一 个 流程 实例 同时 可以 有任 意多 个 活动的 oken;如 果 流 程 实 例 的 活 动 Token数量 为 0,即表 示流 程已 经结 束了 。T_F_RT_JOINPOINT 汇聚 点表 ,用 于进 行汇 聚计 算。cd Dat Model2T_F_DF_WORKFLOWDEFT_F_RT_JOINPOINTT_F_RT_PROCESINSTANCE T_F_RT_PROCINST_VART_F_RT_ASKINSTANCET_F_RT_OKENT_F_RT_WORKITEM0.*+FK_TaskInstance_IdWorkItem.TaskInstance

11、_Id = TaskInstance.Id10.*+FK_ProcesInstance_Id2ProcesInstanceVar.ProcesInstance_Id = ProcesInstance.Id11.*+FK_ProcesInstance_Id1TaskInstance.ProcesInstance_Id = ProcesInstance.Id11.*+FK_ProcesInstance_Id3Token.ProcesInstance_Id = ProcesInstance.Id11.*+FK_ProcesInstance_IdJoinPoint.ProcesInstance_Id

12、= ProcesInstance.Id1T_F_RT_PROCESINSTANCE表各 字段 含义 如下 图T_F_RT_TASKINSTANCE各字 段的 含义 如下 图T_F_RT_WorkItem 各字 段含 义如 下T_F_RT_ProcInst_Var的各 字段 含义 如下T_F_DF_WorkflowDef各字 段含 义如 下3)小结小结小结小结简而 言之 , 将 FireWorkflow嵌入 自己 的系 统非 常简 单, 就 是 将上述 FireWorkflow的 两个 jar包和 第三 方支 持包 扔到 /WEB-INF/lib目录 下。然 后 在数 据库 端创建 ireork

13、fl的 表结构 。如果你 的项 目是 J2SE系统, 仍然 可以 使用 Fireworkflow,只要 将 Fireworkflow的 jar包和 第三 方包 加入 claspath即可 。本文第 6章总 结了将 Fireworkflow嵌入 系统 的详 细步 骤。3.FireWorkflow的 对 象4)工作流模型对象工作流模型对象工作流模型对象工作流模型对象工作 流静 态模 型对 象分 成三 类: 1)Activty和 Task, 2)Synchronizer、 StartNode、 EndNode,3)Transiton。模 型对 象在 org-fireflow-m odel.jar中。

14、a.Activity和 Task:Acitvty在中 文里 一般 称为 “ 活动 ” , 但 是 在我 的文 档里 习惯 称之 为 “ 环节 ” 。 Task是 任务, 代 表具 体的 业务 逻辑 , 如 录 入一 张表 单、 调 用一段 jav代码 或者 调用 另外 一个 流程 ( 子流程 Task)。 一 个 环节 中可 以有 多个 任务 。 例 如某 个入 职流 程中 有一 个体 检环 节, 体 检 环 节包含了 “ 检查视 力 ” 、 “ 检查肝 功能 ” 、 “ 检查心 血管 功能 ” 等等多 个任 务。 在 Fireworkflow中, 体检 环节 建模 如下 :b.Synchro

15、nizer、 StartNode、 EndNodeSynchronizer是同 步器 。 此 处的 “ 同步 ” 是一 个更 加广 义的 概念 ,他 代表 工作 流子 系 统的计 算逻 辑。 开 始 节点 ( StartNode) 和 结束 节点 ( EndNode) 是 同步 器的 特例 , 开 始 节点 是没有 输入 “ 边 ” 的同 步器 ,结 束节 点是 没有 输出 “ 边 ” 的同 步器 。c.Transiton转移( Transiton)在 Fireworkflow并不仅仅是一条连接线,他代表控制权在工作流子系统 和业 务子 系统 之间 交换 。 d.各种模型对象(流程元素 )的组

16、成关系各种 流程 元素 的组 成关 系如 下图cd WorkflowProces AbstractWFElemntWorkflowProcesStartNode NodeSynchronizer EndNodeNodeActivityAbstractWFElemntTaskTransiton111.* 1 0.*1 1.*10.*11.*1如上图所示,一个流程 (WorkflowProces)有且只有一个开始节点 (StartNode), 有 一 个或 者 多 个 环 节 ( Activty), 0个 或 者 多 个 同 步 器 (Synchronizer), 一 个 或 者 多 个 结 束

17、节 点( EndNode), 多 个 转 移 (Transiton)。每个环节可以有 0个或者多个任务( Task), 当环节有 0个任务时,可以用于表达 “ 略过 ” 的概 念( 见 3_各种 工作 流模 式的 实现 第 “ 8略过 (skip)” 章节 )。e.各种流模型对象(程元素 )的继承关系 各种 流程 元素 的继 承关 系如 下图cd WorkflowProces2 interfaceIWFElemntWorkflowProcesAbstractWFElemntNodeActivityTaskSynchronizerTransitonStartNode EndNoderealize

18、从 图 中 可 以 看 出 所 有 的 流 程 元 素 皆 继 承 自 AbstractWFElem nt抽 象 类 。 StartNode和EndNode继承自 Synchronizer,即 开始 节点 和结 束节 点是 特殊 的同 步器 。5)Engiea.Engie的结构FireworkflowEngine的结 构如 下图 。如图所示, FireWorkflow把引擎的功能分解成很多的 Service,这些 Service都 “ 挂接 ”在 Engine的 “ 总线 ” org.firefl.engine.Runtim eContext上。 下面 逐一 解释 这些 Service。IWo

19、rkflowSesion这 是 业 务 代 码 调 用 EngineAPI的 入 口 , 通 过 IWorkflowSesion你 可 以 创 建IProcesInstance,获 得相 应的 TaskInstance, IWorkItem 等等 对象 。显然 , 此 处 应用了 Facde模式 , 你 可以将 IorkflowSesion类比 Jdbc中的 connection。通过 Connection可以 获得 Staem nt, ResultSet等等 对象 。那 么 在 系 统 中 如 何 取 得 IWorkflowSesion对 象 呢 ? Fireworkflow缺 省 情 况

20、下 是 通 过Spring将各种 Service组装 ( 即注 入) 到 Runtim eContext, 所 以 首先 要将 FireflowContext.m l引 入 到 你 的 系 统 中 , 这 是 一 个 spring配 置 文 件 ; 然 后 通 过 类 似 如 下 代 码 获 得IWorkflowSesion。具 体见第 3、第 4章节Runtim eContextrtCtx=m ySpringBeanFactory.getBean(“runtim eContext“);IWorkflowSesionworkflowesion=rtCtx.getWorkflowSesion()

21、;cd Fireflow EngieFire Workflow Engieorg.fireflow.engie.RuntimeContextinterfaceIWorkflowSesioninterfaceIPersitenceSrvice interfaceIDefinitonService interfaceICalendarServiceinterfaceIConditonResolver interfaceITaskInstanceMangerKenlMangerKenl+ IActivityInstance INetInstance+ IodeInstance ISynchroniz

22、erInstance+ ITransitonIstanceEngie API+ IProcesInstance ITaskInstance+ IWorkItemYour Biz SystemYour Biz Datbase (include FireWorkflow tbles)Get and use workflow sesion bjectKenelManager即内核管理器。 FireWorkflow的内核实际上是 “ 工作流逻辑网 ” 的执行机。工作流逻辑网 的相 关概 念见 9_firefl技术 原理 , 它是 PetriNet改造 后的 新的 网结 构。内 核 管 理 器 的 职

23、责 是 根 据 流 程 定 义 文 件 创 建 和 维 护 工 作 流 逻 辑 网 实 例 INetInstance。INetInstance在 PetriNet定义 的执 行规 则下 一步 一步 驱动 流程 实例 执行 。IPersitenceSrvice存储服务。 FireWorkflow缺省情况下使用 hibernate进行数据库存取。如果你的系统不是使用 hibernate, 则 重 新实 现该 类, 然 后 通过 修改 FireflowContext.xml配置 , 将 你的 存储 服务实 现类 注入到 Runtim eContext中。 更详 细的 内容 见 6_工作 流引 擎的

24、结构 及其 扩展 IDefinitionService流 程 定 义 服 务 。 该 服 务 负 责 根 据 流 程 ID和 版 本 号 获 得 流 程 定 义 对 象WorkflowDefinition。从 该对 象可 以获得 WorkflowProces,即 真正 的流 程定 义。FireWorkflow缺 省 提 供 两 种 实 现 , 一 种 实 现 是org.fireflow.engine.definition.DefinitionService4FileSystem 。该 实 现 类 从 文 件 系 统 中 获 得 流 程定义 对象 ,在 开发 阶段 使用 该类 比较 方便 。该

25、类从 claspath中读 取流 程定 义文 件, 因此 你在 项 目 中 设 计 流 程 时 , 推 荐 将 流 程 定 义 文 件 置 于 /src或 者 其 子 目 录 中 。DefinitionService4FileSystem 忽略 流程 的版 本, 直接 读取 当前 的流 程定 义文 件。另一 个实 现是 org.fireflow.engine.definition.DefinitionService4DBMS。 该 实 现类 从数 据 库表 T_F_DF_WORKFLOWDEF中获得 流程 定义 文件 。因 为表 T_F_DF_WORKFLOWDEF中保 存了 流程 的版 本号

26、 ,因 此该 类在 产品 真正 运行 时使 用。 在 FireflowContext.xml修改 相关 的配 置即 可实 现这 两个 类的 切换 。ICalendarService日历 服务 。日 历服 务负 责获 取系 统时 间和 计算 TaskInstance的 ExpiredDate。缺 省 实 现 中 ,系统 时间 是返回 newDate(), 也 只 考虑 了周 六、 周 日 作为 节假 日的 情况 。 你 可 以扩 展该 类 获取数 据库 时间 所谓 系统 时间 ,增 加节 假日 配置 。 IConditionResolver转移 条件 解析 器, 用于 计算 转移 条件 中的 E

27、L表达 式的 值。ITaskInstanceManager任务管理器,负责创建任务实例。缺省实现是 BasicTaskInstanceManager,作为一个真实的 应用 一般 需要 扩展 这个 类。 具体 原因 见 5_工作 流应 用中 经典 问题 的解 决方 案, 在此不喧 宾夺 主地 描述 了。b.EngieAPI你的 业务 代码 在调用 FireWorkflowEngine时需 要涉 及到 的对 象如 下图 cd Engie APIinterfaceIProcesInstance interfaceITaskInstance interfaceIWorkItem0.11 0.11IPr

28、ocesInstance是流 程实 例, 包 含 多个 任务 实例 ITaskInstance, 每 个 任务 实例 可以 包 含0个或 者多个 IWorkItem 。各 对象 具体 的方 法说 明见 API文档 。你或 许会 疑惑 , 为 什么 业务 代码 不需 要调 用到 ITaskInstance, ISynchronizerInstance, 和ITransitonInstance。在 Fireworkflow中你 在一 般情 况下 确实 不需 要关 心这 些对 象,具 体 原 因我们 留在 以后 慢慢 探讨 。 在 Fireworkflow中, 将 上述 对象 划归到 kenel中,

29、 而 且 设计 成无 状态的 对象 ,以 减少 数据 库表 。4.业 务 数 据 vs工 作 流 数 据1)业务数据及工作流数据的划分和存储业务数据及工作流数据的划分和存储业务数据及工作流数据的划分和存储业务数据及工作流数据的划分和存储业务 数据 和工 作流 数据 的划 分以 及存 储方 案一 直是 一个 经典 的且 令人 头痛 的问 题。我 认为业 务数 据和 工作 流数 据不 可能 截然 分开 ,二 者有 交集 。如 下图上图 中哪 些数 据对 工作 流和 业务 都有 影响 呢? 例如 : 受 理 编号 、 审 核 意见 。 这 些 数据 本来 应该 是业 务数 据, 但 是 流程 在流

30、转的 过程 中也需 要他 们。 受理 编号 用于 关联 流程 实例 和业 务表 单, 审核 意见 决定 流程 的下 一步 走向 。 再例 如: 流 程 实例 的当 前环 节和 环节 状态 。 这 些 数据 本来 是流 程数 据, 但 是 业务 系统 经常需 要查 询这 些信 息。上图 交集 中的 数据 怎么 存储 呢? 通常 有如 下几 种方 案。方案 一、 工作 流数 据侵 入业 务系 统表 在业 务系 统表 结构 中不 但有 业务 字段 ,还 有工 作流 相关 的字 段, 例如 :流 程实 例编 号、当前 环节 名称 、当 前环 节状 态、 下一 环节 名称 等等 。 这种 方法 的优 点

31、是 ,查 询 统计 比较 方便 。例 如 某业 务在 当前 在那 个环 节,处 于 什么 状 态 ,一目 了然 。这种 方法 的缺 点是 使得 业务 数据 不 “ 纯净 ” 。而 且如 果业 务审 批项 目比 较多 ,则 在每 个审批 项目 的主 业务 表中 都需 要嵌 入流 程字 段, 会使 得流 程系 统和 业务 系统 耦合 得很 紧。 方案 二、 将业 务数 据当 作流 程变 量存 储到 工作 流系 统中 由于 流程 变量 一般 是以 key-value方式 存储 的, 不利 于查 询统 计。 例如 “ 要根 据流 水号查询 出该 业务 当前 处于 哪个 环节 ” 实现 起来 很麻 烦。

32、方案 三、 Fireworkflow的方 案Fireworkflow的 方 案 是 扩 展 任 务 实 例 表 T_F_RT_TaskInstance。 这 个 扩 展 不 是 在工作 流数 据 业务 数据对 工 作 流和 业 务 都有 影 响 的数据T_F_RT_TaskInstance中 增 加 字 段 , 而 是 增 加 一 张 新 表 , 假 设 新 表 的 名 称 是_Biz_MyaskInstance。 二 者的 关系 如下 图,( 字 段以 FireflowExam ple中的 某商 场送 货流 程为 例 )。 cd Dat Model Dat Model2:T_F_RT_ASK

33、INSTANCE*PKcolumn ID: VARCHAR2(10 CHAR)* l BIZ_TYPE: V2(10 CHAR)*column TASKID: ARCHAR( )* l CIVITY_I: VA2(10 CHAR)*column NAME: ARCHAR2(10 CHAR) l DISPLY_NME: VAR2(56 CHAR) column TAE: UBR(10) l SK_TYPE: VACHAR2(30 CHAR)*column CREAED_TIME: BLOB l STTI: column EXPIRED_TIME: BLOB l ND_TIM: BLO*colum

34、n ASIGNENT_STRATEGY: VARCHAR2(510 CHAR)* l PROCESI ANC_ID: ( )*column _ID: VRHAR2(510 CHAR)* l VERSION: UMBE(10)+ PK SY_C0512(VARCHAR2/CHAR)Dat Model2:T_F_RT_WORKITEM*PKcolumn ID: VARCHAR2(10 CHAR)* l STE: NUMBER()*column CRATD_TI: BLOB l SIGNEIME: column ED_TI: BLOBl ACORID: VARCHAR2(10 CHAR) colum

35、n MENTS: (248 )*FKl TASKI ACE_ID: VARCHAR2(10 CHAR)+ PK SY_C0523(VARCHAR2/CHAR) F FK4134DE527D(V2/CHAR)T_Biz_MyTaskInstance column TaskInstance_Id: l : column : l : column : 0.*+FK_TaskInstance_IdWorkItem.TaskInstance_Id = TaskInstance.Id11+FK_TaskInstance_Id2MyTaskInstance.TaskInstance_Id = TaskIns

36、tance.Id1上述 设计 虽然 冗余 了部 分业 务特 征数 据( 业务 流水 号、客 户 名称 、商 品名 称、商 品 数 量 ) ,但是 保持 业务 表的 纯净 ,不 会有 工作 流数 据侵 入。 最最 重要 的是 ,这 种设 计的 使得 查询 统计 非常 方便 。 例 如 : 如 果 你 想 跟 踪 某 个 客 户 购 买 的 商 品 现 在 处 于 那 个 环 节 了 , 只 要 联 合T_F_RT_TaskInstance和 T_Biz_MyTaskInstance进 行 查 询 即 可 。 而 且 这 两 个 表 的 数 据 是 1对 1的, 通过 TaskInstanceId

37、进行 关联 , 性 能 也不 会有 大的 问题 。( 当 然, 性 能 还是 有优 化 的空间 ,具 体见 5_工 作 流 应 用 中 经 典 问 题 的 解 决 方 案 )。再 例 如 : 你 需 要 查 询 某 个 客 户 的 或 是 谁 送 的 , 只 要 联 合 T_F_RT_TaskInstance、T_Biz_MyTaskInstance和 T_F_RT_WorkItem 即可 。2)必要的扩展必要的扩展必要的扩展必要的扩展现在 的问 题是 T_Biz_MyTaskInstance中的 数据 怎么 填入 呢?Hibernate的 父 子 对 象 映 射 机 制 给 我 带 来 了

38、便 利 。 我 们 知 道org.fireflow.engine.im pl.TaskInstance映 射 到 T_F_RT_TaskInstance。 那 么 我 们 扩 展org.firefl.engine.im pl.TaskInstance 类 , 得 到org.fireflow.exam ple.workflow_ext.MyTaskInstance。他 们的 继承 关系 和映 射关 系如 下图 。cd Dat Model Dat Model2:T_F_RT_ASKINSTANCET_Biz_MyTaskInstanceorg.fireflow.engie.impl.TaskIst

39、acorg.fireflow.example.workflow_ext.MyTskInstance 1+FK_TaskInstance_Id2MyTaskInstance.TaskInstance_Id = TaskInstance.Id1Extendor mapingor maping仅 仅 扩 展 org.fireflow.engine.im pl.TaskInstance还 是 没 有 解 决 问 题 , 还 需 要 扩 展org.fireflow.engine.taskinstance.BasicTaskInstanceManager。BaiscTaskInstanceManager的

40、 作 用 是 为 工 作 流 引 擎 创 建org.fireflow.engine.im pl.TaskInstance实例 。其 代码 很简 单, 如下 图。我 们 扩 展 BaiscTaskInstanceManager得 到 org.fireflow.exam ple.workflow_ext.MyTaskInstanceManager。 该 类 负 责 给 工 作 流 引 擎 提 供 MyTaskInstance实 例 同 时 填 充yaskInstance中 的 业 务 字 段 。 因 为 MyTaskInstance是 TaskInstance子 类 , 所 以 在 Engine中

41、和 TaskInstance一样 是 “ 畅行 无阻 ” 的。 yTaskInstanceManager代码 如下 图。MyaskInstanceManager必须注册到 FireflowContext.xml中,见 6-4)-a)章节。为了使得yTaskInstance实例 能够被 hibernate持久 化,还 必须将 MyTaskInstance.hbm.xm l配置 文件 加入到 hibernate的映 射文 件列 表中 。在这 里必 须说 明一 点, 在 我 的设 计中 MyTaskInstanceManager的业 务字 段来 自于 流程 变量 ( 如上 图)。 因 此 , 如 果

42、希 望填 充或 者变更 yaskInstance实例 中业 务字 段的 值必 须先 调用 IProcesInstance.stProcesInstanceVarible(Stringnam e,Objectvalue)设置 相关 的变 量,然 后再执 行流 程操 作。 当然 ,你 也可 以考 虑更 好的 策略 。 5.常 见 流 程 操 作 在 FireWorkflow中 的 实现我们 用下 面的 案例 来认 识常 见的 流程 操作 。假 设有 某业 务流 程如 下: 受理 -审核 -归档。 首先 考察 一下 受理 岗操 作员 的操 作。 首 先 , 操 作 员填 写表 单, 保 存 数据 ;

43、 同 时系 统应 该给该 业务 创建 新的 业务 流程 实例 。为 了 能够 使得 业务 流程 实例 和业 务数 据相 关联 ,需 要 给 业务流 程设 置流 程变 量, 将 业 务数 据的 关键 字段 设置 到流 程实 例中 去。 在 实 际业 务中 , 大 多 数情况 下受 理岗 操作 员一 保存 数据 ,流 程即 流转 到审 批环 节, 不需 要操 作员 再做 额外 的操 作。因此 ,系 统 应该 自动 启动 并自 动完 成第 一个 环节 及其 工单 。总 结 一下 受理 岗的 流程 操作 如 下表。 岗 位名称 操 作员的操作 业 务系统自动完成的 流 程操作业 务操作 流 程操作受理

44、 岗 1、填 写表 单并 保存 无 1、 创建 流程 实例2、 设置 流程 变量3、 运行 流 程 实 例 使 之 启 动“ 受理 ” 环节4、 自动 结束 “ 受理 ” 环节 ,再考 察一 下审 核岗 操作 员的 操作 。 一 般 情况 下, 操 作 员需 要签 收待 审核 的工 单, 然 后 填写审 核意 见, 然 后 保存 审核 意见 。 在 实 际业 务中 , 既 可 以在 保存 审核 意见 的同 时, 自 动 结 束相关 的工 单, 使 得 流程 流转 到下 一个 环节 ; 也 可 以, 单 独 提供 一个 按钮 , 让 操作 员点 击一 下才结 束工 单。此 处 假设 需要 操作

45、员点 击一 下按 钮才 结束 工单 。总 结 一下 审核 岗的 流程 操作 如下。最后 考察 一下 归档 岗的 操作 。 同 审 核岗 类似 , 操 作 员首 先签 收相 关的 工单 , 然 后 填写 必要的 业务 信息 并保 存, 最后 点击 按钮 结束 工单 。总 结该 岗位 的流 程操 作如 下。总结 : 由 上 面的 案列 可知 , 除 了 第一 个环 节的 流程 操作 稍有 不同 之外 , 后 续 环节 的流 程操作 是雷 同的 , 都 是操 作员 “ 签收 工单 -录入 业务 数据 并保 存 -结束 工单 ” 。 整 个 流程 实 例的结 束是 工作 流引 擎自 动完 成的 ,不

46、需要 任何 外部 操作 。 下面我们详细讲解这些常见的业务流程操作如何调用 FireWorkflow的接口来实现。下面的 代码在 FireflowExam ple中, 这个 Exam ple模拟 某商 场送 货流 程。 流程 图如 下。实例 及其 工单 , 是 流 程流 转到 “ 审核 ” 环节岗 位名称 操 作员的操作 业 务 系 统 自 动 完成 的流程操作业 务操作 流 程操作审核 岗 2、填 写 审 核 意 见 并 保存 1、签 收工 单3、 点 击相 关按 钮结 束 工单 无岗 位名称 操 作员的操作 业 务 系 统 自 动 完成 的流程操作业 务操作 流 程操作归档 岗 2、填 写

47、 相 关 业 务 信 息并保 存 1、签 收工 单3、 点 击相 关按 钮结 束 工单 无1)创建流程实例、设置流程实例变量、自动完成第一个环创建流程实例、设置流程实例变量、自动完成第一个环创建流程实例、设置流程实例变量、自动完成第一个环创建流程实例、设置流程实例变量、自动完成第一个环节节节节的工单的工单的工单的工单在 FireflowExam ple中, 收银 员收 到货 款, 录入 客户 、货 物、 金额 等信 息即 可, 流程 会自动 流转 到仓 库备 货环 节。 因 此 业务 代码 需要 将启 动流 程、 设 置 流程 实例 变量 、 自 动 完成 第一 个 环 节 这 三 个 流 程

48、 操 作 一 并 完 成 。 相 关 代 码 在org.fireflow.exam ple.mbeans.Paym entBean.doSave() 中。 如下 图。如图 所示 ,第 6行保 存业 务数 据。第 8行获得 IWorkflowSesion对象 ,其中 workflowRuntim eContext是由 JSF的机 制注 入的, workflowRuntim eContext来自 FireflowContext.xml。第 1行、 12行通过 IWorkflowSesion的接 口创 建流 程实 例。第 14行至 22行设 置流 程实 例变 量。第 24行启 动流 程实 例。第 2

49、6行至 33行自 动完 成当 前操 作员 在当 前流 程是 实例的 WorkItem , 即 由 “ 客户 付款 ”这个 Task产生的 WorkItem 。你或 许有 一个 疑问 ,流 程实 例启 动后 ,第 一个 环节的 WorkItem 一定 会分 派给 当前 操作员吗 ?如 果没 有派 给当 前操 作员 则第 26行至 33行的 操作 不会 成功 。通 过下 面的 方法 可以 保证第 一个 环节的 WorkItem 会分 派给 当前 操作 员。 首先 付款 Task的 Perform er属性 设置 如下图:由上图 可知 “ 付款 ” 任务是 由 org.fireflow.exam ple.ou.CurrentUserAsignmentHandler完成的 。 我 们 看一 下这 个类 的代 码, 如 下 。 从 下 面的 代码第 8行可 以看 出, 系 统 将当 前用 户 作为认 为实 例的 操作 员, 因此 自动 完成 第一 个环 节的 工单 可以 顺利 实现 。2)FireWorkflow的任务分配机制的任务分配机制的任务分配机制的任务分配机制Fi

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报