osworkflow中的主要方法源码分析
一、 doAction方法
Workflow fw = new BasicWorkflow("username"); //创建一个workflow
long id = Long.parseLong(request.getParameter("workflowId"));
String doActionString = request.getParameter("doAction"); //从request中得到将要进行的动作
if (doActionString != null && ! doActionString.equals("")) {
int actionId = Integer.parseInt(doActionString);
wf.doAction(id, actionId, Collections.EMPTY_MAP);
}
Wofkflow接口里面提供方法public void doAction(long id, int actionId, Map inputs) throws InvalidInputException, WorkflowException;
id是workflow的id号,actionId是即将要进行的动作的id。该方法进行如下动作:
1、根据workflow的id得到该工作流实例(entry),如果该实例的状态不是Activated的,则立即返回。
2、调用的populateTransientMap方法。该方法把众多参数都存放入transientVars这个map中,包括context,workflowDescritor(工作流XML文件描述对象),actionId等。
3、判断要执行的这个action是否存在(在globalActions与当前所有step的action的列表中查找),并且其验证条件是否满足。如果action没有找到或者验证不通过,则抛出InvalidActionException。
4、调用transitionWorkflow方法。该方法返回流程实例是否明确完成的标记,如果流程结束,则返回true,否则返回false。
5、若流程没有明确表明结束,则用checkImplicitFinish方法检查该流程是否已经结束,它会检查当前step中是否还有有效的action未执行,若没有,则结束该流程实例。
二、 transitionWorkflow方法
protected boolean transitionWorkflow(WorkflowEntry entry, List currentSteps, WorkflowStore store, WorkflowDescriptor wf, ActionDescriptor action, Map transientVars, Map inputs, PropertySet ps) throws WorkflowException
transitionWorkflow方法是工作流最最核心的方法。如果流程结束,则返回true,否则返回false。
1、调用getCurrentStep方法返回一个当前有效的step。如果currentSteps这个列表中只有一个step,则返回该step,否则遍历所有的list,返回一个当前有效的step(action可执行)。
2、验证transientVars里的参数是否符合该action的执行要求。
3、执行当前该step的所有post-functions。因为我们要离开当前这个step,进入下一个step,因此要进行收尾工作。
4、执行action的所有pre-functions。
5、遍历action的所有有条件结果(condition-result),选取一个满足条件的result,验证transientVars里的参数,并把pre-functions和post-functions放入extraPreFunctions和extraPostFunctions中。
6、如果该action没有有效的有条件结果,则执行无条件结果(unconditional-result),验证transientVars里的参数,把pre-functions和post-functions放入extraPreFunctions和extraPostFunctions中。
7、执行将要执行的结果中的pre-functions,即extraPreFunctions。
8、如果该结果是一个分支(split),进行以下步骤:(1)遍历该分支的所有结果,验证transientVars中的参数是否满足条件。(2)执行所有分支结果的pre-functions。(3)如果该action还没有finish,则执行所有的split的结果。调用createNewCurrentStep方法,把当前step放入historySteps,并且创建新步骤。(4)执行所有分支结果的post-functions。
9、如果该结果是一个join,进行以下步骤:(1)把当前步骤标记为finished,并将其移入historySteps。(2)在刚结束的step,当前其他的cuttentSteps与historySteps中查找,如果step是通往join节点的step,则把它放入joinSteps中。然后把joinSteps以JoinNodes的方式放入transientVars中。(3)检查join节点的条件是否符合,验证transientVars中的参数,执行joinresult的pre-functions。(4)检查joinSteps中除刚结束节点之外的其他节点(因为刚结束的节点在之前已经放入historySetps中),如果不在历史节点中,则moveToHistory。 (5) 如果该action还没有finish,则把所有通往join节点的step放入previousIds中,调用createNewCurrentStep方法,并且创建新步骤。(6)执行结果的post-functions。
10、如果该结果既不是split,也不是join,则直接调用createNewCurrentStep方法,把当前step放入historySteps,并且创建新步骤。
11、执行结果(result)中的post-functions,即extraPostFunctions。
12、执行action中的post-functions。
13、如果该action是初始动作(initial action),则把workflowEntry设置为ACTIVATED。
14、如果该action是结束动作,则把workflowEntry设置为COMPLETED。返回true。
15、执行其他有效的自动动作(auto actions)。
三 createNewCurrentStep方法
private Step createNewCurrentStep(ResultDescriptor theResult, WorkflowEntry entry, WorkflowStore store, int actionId, Step currentStep, long[] previousIds, Map transientVars, PropertySet ps) throws WorkflowException;
theResult是当前要执行的结果(result),currentStep是当前的步骤,previousIds是通向下一个step的步骤集合。
1、如果nextStep不存在,则把nextStep设置为当前的step。
2、用step的oldStatus来标记currentStep的status,表明结束当前步骤。把当前step放入历史步骤中。
3、用createCurrentStep方法创建新的newStep,设置其owner,startDate等。
4、如果这是一个新流程的起始step,则创建一个当前步骤列表,把newStep放入当前步骤列表中,并把该列表放入transientVars。
5、执行该newStep的所有pre-functions。
分享到:
相关推荐
### 四、osWorkflow 源码分析 源码中包含了 osWorkflow 的核心组件,如 WorkflowEngine、WorkflowDefinition、PersistenceManager 等。通过阅读源码,我们可以了解其内部实现细节,如: - 如何解析 XML 流程定义...
源码分析 - **osworkflow-2.7.0.jar**: 这是OSWorkflow的主要库文件,包含了所有核心类和接口,如`com.opensymphony.workflow.Workflow`、`com.opensymphony.workflow.query.Query`等。 - **osworkflow数据库配置...
在本文中,我们将深入探讨如何利用OsWorkFlow来创建和管理流程图,并通过源码分析,理解其实现原理。 首先,我们要了解OsWorkFlow的基本概念。工作流引擎是负责执行工作流定义的软件,它能够处理工作流实例的生命...
源码分析可以帮助我们更好地理解和定制这些应用场景,提升工作效率。 总的来说,osWorkflow 源码的学习涵盖了工作流管理的关键技术,包括工作流定义、实例化、执行和监控等,对于想要深入理解工作流引擎的开发者来...
解压缩 "osworkflow2.8.rar" 文件后,通常会包含源码、文档、示例和库文件。开发者需要根据项目需求进行配置,将OSWorkflow集成到应用中,这可能涉及到添加依赖、配置数据库连接以及初始化工作流表。 4. **API ...
这两个框架在IT行业中主要用于构建复杂业务流程管理系统,帮助企业自动化和优化其业务流程。 OSWorkflow,全称为Open Source Workflow System,是一个轻量级、可扩展的工作流引擎,允许开发者定义和执行业务流程。...
2. osworkflow的源码分析,可能涉及到核心类和方法,以及如何通过修改源码来定制化工作流引擎。 3. 在实际项目中的部署和集成,包括配置、API调用、错误处理等。 4. 使用osworkflow解决的具体业务问题,例如流程自动...
文章作者可能分享了如何结合源码和工具,如OSWorkflow提供的API和监听器机制,来实现动态会签的实践经验。 总结来说,OSWorkflow的动态会签功能是通过条件分支和并行会签节点实现的,开发者需要理解其工作原理,并...
在源码分析方面,我们需要理解osworkflow-canvas的流程定义和执行逻辑,包括流程图的解析、工作项的创建和更新、状态的转移等。同时,要熟悉Nginx的模块结构和配置语法,了解如何通过修改配置文件实现动态路由、负载...
4. **流程定义**:理解并分析示例中的请假审批流程,这通常包含请假申请、部门主管审批、人事部门审批等多个环节,每个环节对应工作流中的一个状态或任务。 5. **部署流程**:在OSWorkflow中定义并部署这个流程模型...
标签“源码”表明这篇文档可能包含了部分源码示例,这对于开发者深入理解OSWorkflow的内部运作和扩展功能非常有帮助。而“工具”标签则暗示了OSWorkflow作为一款实用工具,能够简化业务流程的开发和维护。 总之,...
综合以上分析,这个系统使用OSWorkflow作为工作流引擎,结合MySQL数据库,构建了一个完整的请假审批流程。它涵盖了从请假申请、审批过程跟踪到审批结果记录的各个环节,并且提供了源代码供开发者深入理解其工作原理...
**六、源码分析** 对于更深入的理解,你可以查看Oswfkflow的源码,研究它如何处理流程实例、任务和状态的内部机制。通过阅读源码,你可以了解到流程的调度、事务管理以及异常处理等方面的知识。 **七、工具支持** ...
通过分析和理解这个"工作流引擎例子(连库Oracle)",我们可以学习到如何在实际项目中实现工作流与数据库的结合,这对于构建企业级应用是非常有价值的。同时,这也为开发者提供了一个动手实践的机会,通过修改源码和...