一.
概述
? 业在q行业务处理Ӟ政府在进行公文审ҎQ都是以程形式而进行的Q在信息化的q程中,企业、政府也这些业务处理、公文审批的q程信息化了Q早期通常 是通过E序编码的方式来处理这些业务、公文的{Q随着业务、公文的复杂的处理情况不断出C及需求的不断变更Q这U硬~码的方式显然已无法应对Q这? 时候工作流理pȝ应运而生Q掀起了一股工作流理pȝ的热潮?/span>
那么到底工作管理系l能够带来什么好处?工作管理系l通过对业务、公文流转进行分析以及抽象,不变和变化的部分进行划分,用户可轻杄通过可视化的工具对事的程、流E环节涉及的人员 ( 角色 ) 、流E环节的表单、流E环节的操作q行修改Q从而到达了应对不断变化的需求的目的Q而工作流理pȝ通常提供的流E监控、查询统计模块更是极大程度的为用户优化流E提供支持,以提高企业、政府的工作效率?/span>
本文主要描述工作管理系l通常的结构、参考模型以及通常使用的调度算法?/span>
?
构成
工作管理系l,U?/span> WFMS Q? l过对业务、公文流转过E的分析以及抽象Q工作流理pȝ围绕业务交互逻辑、业务处理逻辑以及参与者三个问题进行解冻I业务交互逻辑对应的ؓ业务的流转过 E,在工作流理pȝ中对应的提出了工作流引擎、工作流设计器、流E操作来解决业务交互逻辑的问题,业务处理逻辑对应业务{q程中的表单、文档等的处 理,在工作流理pȝ中对应的提出了表单设计器、与表单的集成来解决业务处理逻辑的问题,参与者对应到的ؓ{q程中环节对应的人或E序Q在工作管理系 l中通过与应用程序的集成来解军_与者的问题?/span>
工作管理系lؓ方便业务交互逻辑、业务处理逻辑以及参与者的修改Q多数通过提供可视化的程设计器以及表单设计器来实玎ͼ为实现工作流理pȝ的扩展性,多数提供了一pd?/span> API ?/span>
一个完整的工作管理系l通常由工作流引擎、工作流设计器、流E操作、工作流客户端程序、流E监控、表单设计器、与表单的集成以及与应用E序的集成八个部分组成?/span>
2.1.
工作引?/span>
? 作流引擎作ؓ工作管理系l的核心部分Q主要提供了对于工作定义的解析以及程{的支持。工作流定义文g描述了业务的交互逻辑Q工作流引擎通过解析? 工作定义文件按照业务的交互逻辑q行业务的流转,工作引擎通常通过参考某U模型来q行设计Q通过调度法来进行流E的{ ( 程的启动、终止、挂赗恢复等 ) Q通过各种环节调度法 (SPLIT ?/span> AND ?/span> OR {?/span> ) 来实现对于环节的{ ( 环节的合q、分叉、选择、条件性的选择{?/span> ) ?/span>
2.2.
工作设计器
工作设计器为可视化的流E设计工P用户通过拖放{方式来l制程Qƈ通过对于环节的配|来实现环节操作、环节表单、环节参与者的配置?/span>
工作设计器为用户以及开发商提供了快速绘制、修ҎE的方式Q工作流设计器的好坏军_到工作流理pȝ的易用性?/span>
2.3.
程操作
程操作指所支持的对于流E环节的操作Q如启动程、终止流E、挂hE、直、分?/span> ( 单h办理 ) 、ƈ?/span> ( 多h同时办理 ) 、联审等Q象q些程操作都是可直接基于引擎所提供的环节调度算法来直接支持的,而在实际的需求中Q通常需要自q对于程q行q涉Q如取回、回退、蟩转、追加、传阅、传阅办理等Q而这些流E操作对于工作流引擎来说是不合理的,因此必须单独的去实现?/span>
程操作支持的好坏直接决定到一个工作流理pȝ的实用性?/span>
2.4.
工作客LE序
工作客LE序为工作流pȝ的表现Ş式,通常使用 Web 方式q行展现Q通过提供待办列表、已办列表、执行流E操作、查看流E历史信息等来展现工作流pȝ的功能?/span>
2.5.
程监控
程监控通过提供囑Ş化的方式来对程执行q程q行监控Q包括流E运转状况,每个环节所耗费的时间等{,而通过q些可相应的q行程的优化,以提高工作效率?/span>
2.6.
表单设计?/span>
表单设计器ؓ可视化的表单设计工具Q用户通过拖放的方式来l制业务所需的表单,q可相应的进行表单数据的l定?/span>
表单设计器ؓ客户以及开发商提供了快速修改表单的ҎQ表单设计器的易用与否以及功能的完善与否影响到工作流理pȝ的易用性?/span>
2.7.
与表单的集成
通常业务{需要表单来表达实际的业务,因此需要与表单q行集成来实C务意义,与表单的集成通常包括表单数据的自动获取、存储、修改,表单域的权限控制、流E相x据的l护以及程环节表单的绑定?/span>
与表单的集成的好坏媄响到工作管理系l是否能提高开发效率?/span>
2.8.
与应用程序的集成
通过与应用程序的集成来完善工作流理pȝ的业务意义,主要涉及到的是与权限pȝ以及l织机构的集成。流E环节需要相应的l定不同的执行角Ԍ而流E操作通常需要与权限pȝ、组l机构进行关联?/span>
?
参考模?/span>
工作系l通常通过参考一些标准的模型来进行设计,主要的有 WFMC ?/span> OMG Q在q里主要介绍一?/span> WFMC ?/span>
3.1.
WFMC
WFMC 是国际工作流理联盟Q它?/span> 1993 q成立,发布了一pd的工作流定义、Y件接口的草案文本Q是目前世界上公认的最h威性的工作标准制定机构,得到了广泛的支持和应用?/span>
Z实现不同工作品之间的互操作, WfMC ? 工作管理系l的相关术语、体pȝ构及应用~程接口{方面制定了一pd标准。工作流理联盟l出的工作流定义是:工作是指整个或部分l营q程在计机? 持下的全自动或半自动化。在实际情况中可以更q泛地把凡是p机软gpȝQ工作流理pȝQ控制其执行的过E都UCؓ工作?/span>
一 个工作流包括一l活动及它们的相互顺序关p,q包括过E及zd的启动和l止条gQ以及对每个zd的描q。工作流理pȝ指运行在一个或多个工作引擎上? 于定义、实现和理工作运行的一套Y件系l,它与工作执行者(人、应用)交互Q推q工作流实例的执行,q监控工作流的运行状态?/span>
WFMC 主要提出了五个接口与工作执行服务一起共同组成了工作系l:
l 接口一 ( 工作定义交?/span> ) Q用于在建模和定义工具与执行服务之间交换工作定义。主要是数据交换格式?/span> API 。数据交换通过 XPDL Q?/span> API 通过 WAPI ?/span>
l 接口?/span> ( 工作客L应用接口 ) Q用于工作流客户端应用访问工作流引擎和工作列表,通过 WAPI 完成?/span>
l 接口?/span> ( 被调用的应用接口 ) Q用于调用不同的应用pȝ?/span>
l 接口?/span> ( 工作系l互操作接口 ) Q用于不同工作流pȝ之间的互操作?/span>
l 接口?/span> ( pȝ理和监?/span> ) Q用于系l管理应用访问工作流执行服务?/span>
?
核心调度法
通常程引擎采用的核心调度算法主要有 FSM 以及 PetriNet 两种Q基于调度算法来完成程的流转?/span>
4.1.
FSM(
有限状态机
)
FSM 的定义ؓ包含一l状态集Q?/span> states Q、一个v始状态( start state Q、一l输入符号集Q?/span> alphabet Q、一个映输入符号和当前状态到下一状态的转换函数Q?/span> transition function Q的计算模型。当输入W号Ԍ模型随即q入起始状态。它要改变到新的状态,依赖于{换函数。在有限状态机中,会有有许多变量,例如Q状态机有很多与动作Q?/span> actions Q{?/span> (Mealy ?/span> ) 或状态(摩尔机)兌的动作,多重起始状态,Z没有输入W号的{换,或者指定符号和状态(非定有限状态机Q的多个转换Q指z接收状态(识别者)的一个或多个状态,{等?/span>
遵@ FSM 程引擎通过状态的切换来完成流E的{?/span>
4.2.
PetriNet
信息的一个抽象的、Ş式的模型。指Zpȝ的静态和动态性质?/span> petrinet 通常表示成图。图中有两类用弧彼此相连的结点(UCؓ地点和变换)和指C其动态性能的标讎ͼUCؓ记号Q?/span>
遵@ PetriNet 程引擎通过令牌来决定流E的{?/span>
<step id="1" name="Form Filling">
<actions>
<action id="2" name="Fill Form">
<results>
<unconditional-result old-status="Finished" split="1"/>
</results>
</action>
</actions>
</step>
<splits>
<split id="1">
<unconditional-result old-status="Finished"
status="Underway" owner="Risk Analyst" step="2"/>
<unconditional-result old-status="Finished"
status="Underway" owner="Financial Officer" step="3"/>
</split>
</splits>
<joins>
<join id="1">
<conditions type="AND">
<condition type="beanshell">
<arg name="script"><![CDATA[
"Finished".equals(jn.getStep(2).getStatus()) &&
"Finished".equals(jn.getStep(3).getStatus())
]]></arg>
</condition>
</conditions>
<unconditional-result old-status="Finished"
status="Underway" owner="Manager" step="4"/>
</join>
</joins>
orkflow wf = new BasicWorkflow(username);
HashMap inputs = new HashMap();
inputs.put("docTitle", request.getParameter("title"));
wf.initialize("workflowName", 1, inputs);
<action id="1" name="Execute business rule">
<pre-functions>
<function type="class">
<arg name="class.name">java.net.DroolsExecutorFunction</arg>
<arg name="ruleBaseName">BusinessRules.drl</arg>
</function>
</pre-functions>
...