Fire Workflow是最近兴起的国内比较火的开源工作流引擎,本人从发现它、应用它到解读它,感觉很有前途。本开源项目有个谦逊的leader——非也,有个稳定良好的团队,我相信只要坚持,它的发展是长远和美好的。
FireWorkflow的源代码主要 包含两个部分:FireflowEngine和FireflowModel,其中FireflowEngine主要是一些工作流运行时的服务,如事件处理、条件判断、数据持久化、工作流委派等等服务和操作,另外还预留了一些扩展接口。FireflowModel主要是一些流程定义的基本组建,流程定义的解析服务以及序列化服务等,另外还提供了对资源和参与者的接口。
先开始讲FireflowModel这个部分中的包org.fireflow.model,由于代码没有全部看完,因此先说一些包和类的基本构成,希望对大家有帮助。这是整个包的类图。
下面开始对每个部分进行分析:
IWFElement:工作流元素的抽象接口
getSn(), setSn(): 返回和设置元素的序列号,系统自动处理,开发者无需关心。
getId():返回工作流元素的Id, 工作流元素的Id采用“父Id.自身Name”的方式组织。
getName(), SetName(): 返回和设置工作流元素的名称。
getDisplayName(), setDisplayName(): 返回和设置工作流元素的显示名称。
getDescription(), setDescription(): 返回和设置工作流元素的描述。
getParent(), setParent(): 返回和设置父节点。
getEventListeners(): 返回事件监听器列表。
getExtendedAttributes(): 返回扩展属性Map。
AbstractWFElement:流程元素抽象类。
实现了IWFElement中的方法,并重写了hashCode()和toString()方法。
Task:工作流任务。
前四个为工作流类型:
TOOL:TOOL类型,即工具类型任务,该任务自动调用java代码完成特定的工作。
SUBFLOW:SUBFLOW类型,即子流程任务。
FORM:FORM类型,最常见的一类任务,代表该任务需要操作员填写相关的表单。
DUMMY:DUMMY类型,该类型暂时没有用到,保留。
接下来三个是任务分配指示:
REDO:重做类型。对于Tool类型和Subflow类型的task会重新执行一遍,对于Form类型的Task,重新执行一遍,且将该任务实例分配给最近一次完成同一任务的操作员。
SKIP:跳过忽略类型。循环的情况下该任务将被忽略,即在流程实例的生命周期里,仅执行一遍。
NONE:无类型。对于Tool类型和Subflow类型的task会重新执行一遍,和REDO效果一样的。对于Form类型的Task,重新执行一遍,且工作流引擎仍然调用Performer属性的AssignmentHandler分配任务。
其他变量:
type: 任务类型,取值为FORM,TOOL,SUBFLOW,DUMMY(保留),缺省值为FORM
duration: 自定义类型,任务执行的时限,可查看duration类。
priority: 任务优先级别(1.0版本中暂未使用)。
loopStrategy:循环情况下任务执行策略,取值为REDO、SKIP和NONE。
taskInstanceCreator:任务实例创建器。如果没有设置,则使用所在流程的全局任务实例创建器。
taskInstanceRunner:任务实例运行器,如果没有设置,则使用所在流程的全局的任务实例运行器。
taskInstanceCompletionEvaluator:任务实例的终结评价器,用于告诉引擎,该实例是否可以结束。如果没有设置,则使用所在流程的全局的任务实例终结评价器。
WorkflowProcess:业务流程,是流程描述的顶层元素。
dataFields:流程数据项,运行时转换为流程变量进行存储。
tasks:全局Task。
activities:流程环节,即steps。
transitions: 转移。
loops:循环。
Synchronizers:同步器。
startNode:开始节点。
endNodes:结束节点。
resourceFile:资源文件(在1.0版本中暂时未使用)。
resourceManager:资源管理器(在1.0中暂时未使用)。
taskInstanceCreator:本流程全局的任务实例创建器。 如果没有设置,引擎将使用DefaultTaskInstanceCreator来创建TaskInstance。
formTaskInstanceRunner:本流程全局的FormTask Instance运行器。如果没有设置,引擎将使用DefaultFormTaskInstanceRunner来运行TaskInstance。
toolTaskInstanceRunner:本流程全局的ToolTask Instance运行器。如果没有设置,引擎将使用DefaultToolTaskInstanceRunner来运行TaskInstance。
subflowTaskInstanceRunner:本流程全局的SubflowTask Instance运行器。如果没有设置,引擎将使用DefaultSubflowTaskInstanceRunner来运行TaskInstance。
formTaskInstanceCompletionEvaluator:本流程全局的FormTask Instance 终结评价器,用于告诉引擎该实例是否可以结束。如果没有设置,引擎使用缺省实现DefaultFormTaskInstanceCompletionEvaluator。
toolTaskInstanceCompletionEvaluator:本流程全局的ToolTask Instance 终结评价器,用于告诉引擎该实例是否可以结束。如果没有设置,引擎使用缺省实现DefaultToolTaskInstanceCompletionEvaluator。
subflowTaskInstanceCompletionEvaluator:本流程全局的SubflowTask Instance 终结评价器,用于告诉引擎该实例是否可以结束。如果没有设置,引擎使用缺省实现DefaultSubflowTaskInstanceCompletionEvaluator。
主要方法:
findWFElementById(): 通过ID查找该流程中的任意元素。
findSnById(): 通过Id查找任意元素的序列号。
validate(): 验证workflow process是否完整正确。
isReachable(): 判断节点可达性。
isInSameLine(): 判断两个Activity是否在同一个执行线上。
getReachableNodes(): 获取可达的节点集合。
getEnterableNodes(): 获取当前可流入的节点集合。
DataField:流程变量。
前七个变量为数据类型。
dateType: 数据类型。
initialValue: 初始值。
dataPattern: 数据格式。目前主要用于日期类型。
TaskRef:任务引用。用于Activity引用全局的Task。
referencedTask:被引用的Task。
这个包的其他部分下次再讲。