OSWorkflow是opensymphony组织开发的一个工作流引擎,目前的版本是2.8。OSWorkflow用纯Java语言编写,并且开放源代码。它最大的特点就是极其的灵活。它面向的人群是具有技术背景的软件开发人员。OSWorkflow不提倡用可视化工具定义流程。用户可以根据自己的实际需求,来设计出完全符合自身业务逻辑的系统,而并不需要使用复杂的代码去实现。换句话说OSWorkflow让我们真正解放了,使得我们从底层的代码堆中爬了出来,轻松地用一套通用的引擎机制去实现各种业务流程。OSWorkflow提供我们所有工作流中可能用到的元素例如:步骤(step)、条件(conditions)、循环(loops)、分支(spilts)、合并(joins)、角色(roles)、函数(function)等等。 首先我们来谈谈步骤:步骤是工作流中很重要的概念。如果我们把工作流比喻成一条从起点站驶向终点站的公共汽车路线,那么步骤就相当于汽车站台。而汽车有的正在排队等候进站,有的还没有进站,有的刚出站,这样就形成了所谓的“已完成”、“正在处理”、“已添加至处理队列”、“未处理”等状态。 另外一个重要的概念就是动作,动作就是工作流中每一步骤中"需要处理的事情",每一个动作执行完毕以后都有一个结果。公共汽车停站下客就好比一个动作,动作完成以后,开向下一站,或者加油,或者返程等等就是一个结果。当然,实际上的工作流远比这辆汽车来的复杂,它涉及到的结果还包括原地踏步停留在同一步骤,或者是流转到另外的步骤中去,或者是流转到一个分支中去,或者汇集到一个合并中等。如果动作被设置成为auto,那么只要触发器满足条件或者有来自外部的事件工作流便可自动执行。 在许多流程中,如果遇到并行处理某些事情,这就是分支。分支一般是指并行处理多件事情而没有先后顺序。若有一条分支进行了回退处理,整个流程都将回退。
与之相对的,合并就是把几条符合条件的分支聚合起来,使得事情变成"殊途同归"。这也是非常常见的流程,同时也是最复杂的一种流程。
在步骤、动作和结果中都提供了函数功能,函数按执行的先后时机可分为pre-functions和post-functions。顾名思义,pre-functions就是在事情发生之前执行的,而post-functions就是在事情发生以后执行的。
<pre-functions>
<function type="class">
<arg name="class.name">
com.ewns.service.WfBglcapproveService
</arg>
</function>
</pre-functions>
<results>
<result old-status="Finished" status="Underway"
step="3" >
<conditions type="AND">
<condition type="beanshell">
<arg name="script">
propertySet.getInt("opinion")==2
</arg>
</condition>
</conditions>
<post-functions>
<function type="beanshell">
<arg name="script">
System.out.println("step 2 shenpi did not get through ...");
</arg>
</function>
</post-functions>
</result>
验证器是用来验证用户输入的数据是否合法的。它也可以被应用在步骤,动作或结果中。 动作的执行结果可以是有条件的(conditional)也可以是无条件的(unconditional)。对于有条件结果,可以允许有多个条件。引擎将首先检查是否有满足的条件,它会逐一进行检查,直到符合的条件被找到才能执行。如果没有一个条件被满足,那么最终引擎将产生无条件结果。 在每个步骤中调用工作流的人被称之为调用者(caller),而每个步骤都也会有一个所有者(owner),以代表在当前步骤中负责执行动作的角色或用户。
当前用户在执行当前步骤的时候,这些步骤被保留在当前表中(current),而一旦步骤被执行完毕,引擎会马上将这个当前步骤从当前表中移到历史表中(history)。
OSWorkfow的高级特性有发送邮件,注册器功能,通用动作和全局动作,触发器和定时器等等,以下会一一讲解。
所需JAR包
OSWorkflow自身
OSWorkflow自身(%osworkflow解压包%\):
osworkflow-2.8.0.jar
OSWorkflow核心引用包
OSWorkflow核心引用包(%osworkflow解压包%\lib\ core):
commons-logging.jar:必要,支持日志。
propertyset-1.4.jar:必要,支持propertyset的aggregate ,cached ,memory ,jdbc ,file ,javabeans ,map ,xml接口实现,并不支持hibernate3,如果要支持hibernate3,要自己写代码。这个下面再谈。
oscore-2.2.5.jar:必要,提供了一些工具等。
OSWorkflow可选包
OSWorkflow可选包(%osworkflow解压包%\lib\ optional):
bsf.jar:支持bsf,可选。
bsh-1.2b7.jar:支持beanshell,可选。
ehcache.jar:支持缓存,可选。
osuser-1.0-dev-2Feb05.jar:支持例子里面的用户和群组管理,在涉及到用户和群组的操作建议加上此包。
与Spring2联用所需包
spring2所需的包(%spring解压包%\dist) :
spring.jar(version:2.05)
与Hibernate3联用所需包
Hibernate3所需的包(%hibernate解压包%\lib) :
antlr.jar
cglib.jar
asm.jar
asm-attrs.jars
commons-collections.jar
hibernate3.jar
jta.jar
dom4j.jar
log4j.jar
WorkflowStore
配置osworkflow的核心之一就是配置WorkflowStore。有多种不同的配置方法,下面逐一讲解。
MemoryWorkflowStore
在官方文档里面有现成的例子可以参照,最重要的也就是要把persistence class设置成为com.opensymphony.workflow.spi.memory.MemoryWorkflowStore
具体来说,在\%webapp%\WEB-INF\classes下的osworkflow.xml中:
<osworkflow>
<persistence class="com.opensymphony.workflow.spi.memory.MemoryWorkflowStore"/>
<factory class="com.opensymphony.workflow.loader.XMLWorkflowFactory">
<property key="resource" value="workflows.xml" />
</factory>
</osworkflow>
JDBCWorkflowStore
第一步:web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>OSWorkflow Example App</display-name>
<description>OSWorkflow Example App</description>
<servlet>
8
<servlet-name>SOAPWorkflow</servlet-name>
<servlet-class>com.opensymphony.workflow.soap.SOAPWorkflowServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SOAPWorkflow</servlet-name>
<url-pattern>/soap/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
第二步:配置数据源
第三步:配置osworkflow必要文件。
确定在\%webapp%\WEB-INF\classes\下面有以下几个文件:
example.xml:例子,不作修改。
workflows.xml:例子,不作修改。
osuser.xml,修改如下,请注意红色的数据源部分:
调用接口中的参数和方法详解
Input Map
workflow的initialize、doAction,还有wf.getAvailableActions(id, map)方法都有一个HashMap类型的参数,是用来传递工作流中所需要的数据或者对象的,其有效范围只包括当前步骤或者下一步的 pre-function。可应用在function,condition,validator等当中。
1、Workflow接口里面的主要方法
2、WorkflowDescriptor对象里面的主要方法
3、OSUser几大功能
9 对用户数据进行维护
9 对群组数据进行维护
9 对用户所属群组进行维护
9 提供用户安全验证
9 提供对propertyset数据进行增加删除的支持
OSUser的优点
灵活性:只需要配置一个osuser.xml文件就可以轻松搞定所有与用户和权限相关的逻辑。
通用性:OSUser的设计规范实用于所有的业务系统。
OSWorkflow包的描述
basic
只有两个对象:
BasicWorkflow,未实现事务回滚;
BasicWorkflowContext:上下文对象的Basic实现方式
config
里面主要是读取XML配置文件的一些常用类
loader
在工作流初始化时必须要加载的一些类.主要有WorkflowFactory接口及XMLWorkflowFactory实现类,还有WorkflowDescriptor等描述XML配置文件的实体对象等
OSWorkflow数据库的描述
JDBCWorkflowStore 和JDBCTemplateWorkflowStore这两种方式所用的表结构完全相同。现将所要用到的表结构开列如下并对每一张表每一字段进行详细说明。在此我不对hibernate表结构进行说明,因为有一点点的不同,请自行到我网站上下载源代码进行对比。
Workflow接口中的核心方法
initialize方法
初始化方法主要完成了以下几个功能
z 得到WorkflowStore实现类,利用里面的createEntry方法创建一个WorkflowEntry对象。
z 执行populateTransientMap方法,将context(WorkflowContext),entry(WorkflowEntry),store(WorkflowStore), configuration(Configuration), descriptor(WorkflowDescriptor)装进transientVars;将当前要执行的actionId和currentSteps装进transientVars;将所有XML中配置的register装进transientVars。
z 根据restrict-to里面配置的条件来判断是否能初始化工作流,如果不能则回滚并抛出InvalidRoleException异常。
z 执行transitionWorkflow方法传递工作流,这个transitionWorkflow方法是Workflow中重中之重的方法,以下会进行详细讲解。
z 返回当前工作流程实例ID。
transitionWorkflow方法
transitionWorkflow方法是工作流最最核心的方法,它主要是完成以下功能
z 利用getCurrentStep方法取得当前步骤:如果只有一个有效当前步骤,直接返回;如果有多个有效当前步骤,返回符合条件的第一个。
z 调用动作验证器来验证transientVars里面的变量。
38
z 执行当前步骤中的所有post-function。
执行当前动作中的所有pre-function。
z 检查当前动作中的所有有条件结果,如果有符合条件的,验证transientVars里面的变量并执行有条件结果里面的pre-function;如果动作里面没有一个有条件结果,执行无条件结果,验证transientVars里面的变量并执行无条件结果里面的pre-function。
z 如果程序进入到一个split中:1)验证transientVars里面的变量;2)执行split中的pre-functions;3)如果动作中的finish不等于true,执行split中所有的result;4)结束当前步骤并将其移至历史步骤中去,创建新的步骤并执行新步骤中的pre-function;5)执行split中的post-function。
如果程序进入到一个join中:1) 结束当前步骤并将其移至历史步骤中去;2)将刚结束的步骤和在join中的当前步骤还有历史步骤加到joinSteps集合中并产生JoinNodes对象,将此对象put到transientVars里;3)检查join条件;4)执行join有条件结果中的validator;5)执行join有条件结果中的pre-function;6)如果当前步骤不在历史步骤里面,把它移到历史步骤里面去;7) 如果刚刚结束的当前动作中的finish不等于true,创建新的步骤并执行新步骤中的pre-function;8)执行join中的post-function。
z 如果程序进入到另一个step中:结束当前步骤并将其移至历史步骤中去,创建新的步骤并执行新步骤中的pre-function。
z 如果动作里面有符合条件的有条件结果,执行有条件结果里面的post-function;如果动作里面没有一个有条件结果,则执行无条件结果里面的post-function。
z 执行动作里面的post-function。
z 如果动作一开始是一个初始状态,将设置ACTIVATED标识;如果动作在XML里面有完成状态的标识,将设置COMPLETED标识。
z 执行有效的自动动作(auto action)。
z 最后返回流程是否完成的布尔值:如果流程实例已经完结,返回true;否则返回false。
doAction方法
z 判断工作流程实例的状态,如果状态不为ACTIVATED(1),直接返回。
z 利用findCurrentSteps方法得到当前所有步骤列表。
z 执行populateTransientMap方法,将context(WorkflowContext),entry(WorkflowEntry),store(WorkflowStore), configuration(Configuration), descriptor(WorkflowDescriptor)装进transientVars;将当前要执行的actionId和currentSteps装进transientVars;将所有XML中配置的register装进transientVars。
z 检查全局动作(Global Action)和当前步骤里面所有动作的有效性。如果有无效动作,直接抛出InvalidActionException异常。
z 执行transitionWorkflow方法传递工作流,如果捕获到WorkflowException,抛出异常并回滚。
如果动作中没有显式地标明finish的状态为true,那么这时要执行checkImplicitFinish方法,查找当前步骤中是否还有有效动作,如果没有一个有效动作,则直接调用completeEntry方法结束流程并将流程的状态设置成为COMPLETED(4)。
如何与现有系统集成
在初始化一个新的工作流时,必须要在你的Service层执行以下方法:
public long doInitialize(String un, String title, String content) throws Exception {
Workflow wf = new BasicWorkflow(un);
long wf_id = -1;
try {
wf_id = wf.initialize("example", 100, null);
}
catch (Exception e) {
throw e;
}
return wf_id;
}
这时候要加入自己的业务逻辑代码,例如:
workflowDAO.saveDocumentation(wf_id, title, content);
os_doc有三个字段: wf_id(非常重要,绑定工作流ID,主键);title(文档标题),要从创建工作流的前台newdoc.jsp中传过来;content(文档内容)也要从创建工作流的前台newdoc.jsp中传过来。
分享到:
相关推荐
通过osworkflow项目的学习和实践,总结出的一套osworkflow工作流引擎的学习笔记,供需要使用osworkflow系统的同学们借鉴,谢谢!
OSWorkflow
3. 示例代码:压缩包中的"OSWorkFlow"文件可能包含示例代码和配置,供学习参考。 4. 第三方教程:网上有许多关于OSWorkFlow的教程和博客文章,深入讲解各个功能和最佳实践。 总的来说,OSWorkFlow为Java开发者提供...
**osworkflow** 是一个开源的工作流管理系统,专为Java...通过学习和实践这些文档,开发者可以掌握osworkflow的基本用法,了解如何将其与Hibernate和Spring集成,从而在实际项目中构建出高效、灵活的工作流管理系统。
OSWorkflow是一款开源的工作流引擎,主要用于管理应用程序中的复杂业务流程。这款工具提供了强大的工作流建模、执行和跟踪功能,让开发者能够灵活地定义和控制应用程序的流程逻辑。本手册是OSWorkflow的中文版,旨在...
**osWorkflow 概述** osWorkflow 是一个开源的工作流管理系统,专为 Java 应用程序设计,用于处理复杂的业务流程。...通过深入学习和实践,你将能够掌握如何利用osWorkflow 构建高效、可扩展的业务流程管理解决方案。
在这个压缩包中,你将找到一系列资源,包括jar包、学习资料和API手册,这些都是深入理解和使用OSWorkflow 2.8的关键。 首先,让我们详细了解一下OSWorkflow的核心概念和功能: 1. **流程定义**:OSWorkflow允许...
"osworkflow_bundle2" 是一个专门用于学习 OSWorkflow 的示例集合,它包含了一系列的资源和实例,帮助用户理解并掌握如何使用这个强大的工作流框架。在这个压缩包中,你将找到 "osworkflow_bundle" 文件,这是该学习...
本资源包含了OSWorkflow的源代码和相关电子书籍,对于学习和使用OSWorkflow来说,这是一个宝贵的资料库。 首先,让我们深入了解一下OSWorkflow的核心特性: 1. **灵活性**:OSWorkflow的最大亮点是其灵活性。它...
通过学习和运行这些示例,可以理解 OSWorkflow 的核心概念和用法。 6. **扩展与自定义** OSWorkflow 允许开发者自定义工作流行为,如定义新的动作、条件和事件处理器,以适应特定业务需求。同时,它还支持插件机制...
**osWorkflow 指导文档 + 源码详解** osWorkflow 是一款开源的工作流引擎,主要用于处理业务流程...通过深入学习 osWorkflow 的指导文档和源码,开发者能够更好地理解和定制工作流,从而提高应用程序的业务处理能力。
通过理解和实践这个实例,我们可以学习到如何在实际项目中应用工作流引擎,提升软件系统的灵活性和可维护性。无论是在企业级应用还是中小项目中,OsWorkflow都是一个值得考虑的工作流解决方案。
OSWorkflow中文手册OSWorkflow-chinese-manual-2.8.pdf Packt.Publishing.OSWorkflow.A.Guide.for.Java.Developers.and.Architects.Aug.2007.pdf 工作流普及风暴—基础概念.doc 用osworkflow写一个请假例子.rar
**osworkflow** 是一个强大的开源工作流引擎,主要用于在Java应用程序中实现...通过深入学习这些文档,你可以掌握如何利用osworkflow来实现动态、可扩展的工作流解决方案,从而提升你的Java应用程序的业务处理能力。
通过学习这个入门级的例子,你可以掌握如何定义流程、启动流程实例、处理任务,以及如何与现有的应用程序集成。一旦掌握了基础,你就可以根据具体需求扩展 Osworkflow,构建出复杂而高效的工作流管理系统。
OSWorkflow 2.8 API 文档
### OSWorkflow 2.8 知识点概览 #### 一、OSWorkflow 简介与特性 **OSWorkflow** 是一款灵活的工作流管理工具,适用于需要高度定制化流程的应用场景。它与大多数商用或开源工作流软件的不同之处在于其高度的灵活性...
OsWorkflow 是一个基于Java的工作流引擎,主要用于设计和执行复杂的业务流程。这个项目是一个请假申请的工作流示例,其中流程的定义完全存储在XML文件中,这样可以方便地进行流程的配置和更改,无需修改源代码。对于...
4. **文档**:完整的文档是学习任何工具的关键。OSWorkflow 2.80 包含的文档应该涵盖安装指南、API参考、教程和最佳实践,帮助开发者快速上手并深入理解其内部机制。 5. **API 使用**:OSWorkflow 提供了丰富的API...