该篇文档是osworkflow的第三篇,也是我撰写的三篇文档。在阅读osworkflow初始化之前有必要了解osworkflwo的一些基本配置。
首先,我们要知道osworkflow中需要配置的两个重要文件,这两个重要文件的配置是在使用XMLWorkflowFactory类来处理配置文件时一定要有的配置文件。
第一个是osworkflow.xml文件,当然,你不可以随意指定这个文件的名称,而且你必须放到classes的根目录或者META-INF目录下,来看看这个部分的编码:
//使用默认文件名
if (is == null) {
try {
is = classLoader.getResourceAsStream("osworkflow.xml");
} catch (Exception e) {
}
}
if (is == null) {
try {
is = classLoader.getResourceAsStream("/osworkflow.xml");
} catch (Exception e) {
}
}
if (is == null) {
try {
is = classLoader.getResourceAsStream("META-INF/osworkflow.xml");
} catch (Exception e) {
}
}
if (is == null) {
try {
is = classLoader.getResourceAsStream("/META-INF/osworkflow.xml");
} catch (Exception e) {
}
}
该代码来自DefaultConfiguration中的load(url)方法中,当然在这个代码所在的方法中,osworkflow.xml文件是可以指定路径和文件名称的,主要是在调用load的上层AstractWorkflow中却没有传递任何文件路径和名称参数的接口,其实这个地方完全可以改成使用一个参数来确定文件的路径和名称的,传递url到AstractWorkflow中去。
来看看这个文件的格式样例:
<osworkflow>
<!--
<persistence class="com.opensymphony.workflow.spi.memory.MemoryWorkflowStore"/>
-->
<persistence class="com.opensymphony.workflow.spi.jdbc.JDBCWorkflowStore">
<property key="datasource" value="jdbc/osworkflow"/>
<property key="entry.sequence"
value=" select isnull(max(ID),0)+1 from dbo.OS_WFENTRY"/>
<property key="step.sequence"
value="select sum(c1) + 1 from (select 1 as tb, count(*)
as c1 from os_currentstep union
select 2 as tb, count(*) as c1 from os_historystep) as TabelaFinal"/>
</persistence>
<factory class="com.opensymphony.workflow.loader.XMLWorkflowFactory">
<property key="resource" value="workflows.xml" />
<property key="reload" value="true"/>
</factory>
</osworkflow>
这个样例是使用jdbc来持久化流程实例的配置,
这里主要有两个关键结点:
<persistence>和<factory>
1、<persistence>元素中配置了一个class属性,在这里,它是一个持久化实现类的配置,那么里面的子元素都将针对这个class的配置进行特殊的配置,我这里是使用了JDCBWorkflowStore对象,在使用这个对象的前提下,只对三个<property>元素配置进行说明,一个是key属性是entry.sequence和step.sequence的两个<property>元素,这两个元素主要是因为不同是数据库需要配置不同的实现方式,还有就是datasource的数据源元素。
以下分别对这三个元素进行配置说明:
key值为datasource的<property>元素:这个元素的value属性配置的是一个jndi的数据源,我们一般需要在特定的容器中配置特定的jndi数据源,以下是tomcat的例子:
<Context path="/osworkflow" docBase="osworkflow"
debug="99" reloadable="true" crossContext="true" verbosity="DEBUG">
<!-- debug level is set to paranoid, to know what is happening,
turn it off once you do not need it -->
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="OSWorkflow." suffix=".log" timestamp="true"/>
<Resource name="jdbc/osworkflow" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/osworkflow">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>100</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<parameter>
<name>username</name>
<value>sa</value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>net.sourceforge.jtds.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:jtds:sqlserver://localhost:1433/osworkflow</value>
</parameter>
</ResourceParams>
</Context>
在这里,我不对数据源的配置进行细节说明,这里就是有一个很重要的地方需要指出:看这段数据源配置的最初,<Resource>元素中name属性如果配置错误(随意指定名称),那么程序在运行中将发生很多不可以理解的异常,系统会不停的打出数据源找不到的异常,然而我曾经花了很长的一段时间来寻找一个问题的原因,找遍了很多的代码也不能找到问题的原因,直到我后来去研读PropertySet开源项目的时候才发现,原来在这个开源架构的一个内部配置文件中,数据源已经被配置成jdbc/DefaultDS,因此上面这段配置最终会发生异常,因此如果不想让系统打印出数据源异常,这个数据源的配置务必配置成jdbc/DefaultDS,或者修改PropertySet的配置文件,在示例代码中,我故意把数据源的配置保持在错误的状态,读者可以运行这个示例,看看控制台出现了什么错误。不过在接下来的部分,马上就会改回正确配置,以进行下一步的研究。
key值为entry.sequence的<property>元素:在osworkflow中需要我们自己来配置,通常系统中会使用这个配置获取实例存放的数据id。这个值可以不配置,但它只提供了一种数据库的生成语句,它将使用oracle支持的一个nextval(’序列号发生器名称’),去获取。
key值为step.sequence的<property>元素:同样,这里是用来获取当前所在的step的步骤id。同样,它也提供一个默认值,支持类似oracle等db的序列号发生器。
还有其他的很多配置,如果不使用自己特定的物理表格和特别的实现,可以不提供配置。如下来看看部分源代码:
entrySequence = getInitProperty(props, "entry.sequence", "SELECT nextVal(’seq_os_wfentry’)");
stepSequence = getInitProperty(props, "step.sequence", "SELECT nextVal(’seq_os_currentsteps’)");
entryTable = getInitProperty(props, "entry.table", "OS_WFENTRY");
entryId = getInitProperty(props, "entry.id", "ID");
entryName = getInitProperty(props, "entry.name", "NAME");
entryState = getInitProperty(props, "entry.state", "STATE");
historyTable = getInitProperty(props, "history.table", "OS_HISTORYSTEP");
currentTable = getInitProperty(props, "current.table", "OS_CURRENTSTEP");
currentPrevTable = getInitProperty(props, "currentPrev.table", "OS_CURRENTSTEP_PREV");
historyPrevTable = getInitProperty(props, "historyPrev.table", "OS_HISTORYSTEP_PREV");
stepId = getInitProperty(props, "step.id", "ID");
stepEntryId = getInitProperty(props, "step.entryId", "ENTRY_ID");
stepStepId = getInitProperty(props, "step.stepId", "STEP_ID");
stepActionId = getInitProperty(props, "step.actionId", "ACTION_ID");
stepOwner = getInitProperty(props, "step.owner", "OWNER");
stepCaller = getInitProperty(props, "step.caller", "CALLER");
stepStartDate = getInitProperty(props, "step.startDate", "START_DATE");
stepFinishDate = getInitProperty(props, "step.finishDate", "FINISH_DATE");
stepDueDate = getInitProperty(props, "step.dueDate", "DUE_DATE");
stepStatus = getInitProperty(props, "step.status", "STATUS");
stepPreviousId = getInitProperty(props, "step.previousId", "PREVIOUS_ID");
以上这段代码出现在JDBCWorkflowStore的init方法中。它仅仅是读取了我们在DefaultConfiguration中解析配置文件后的map:persistenceArgs,后续我们会读这个类进行全面而细致的分析。
2、<factory> 这个元素主要是配置WorkflowFactory的地方,在这个工厂类中,我们完成了流程模型文件的基本信息的初始化,在实例项目中,使用了XMLWorkflowFactory来完成流程模型基本信息的初始化,以及对流程模型的获取删除等操作进行了代理。这个类也将在以后的章节中进行详细的分析。先来看看这个元素的配置:
这个元素的class属性指定了我们配置了完成模型基本信息初始化的工厂类。例子中使用的
是XMLWorkflowFactory类。
接下来的一个元素就是对模型资源文件的配置,这个资源文件存放了全部流程模型的路径等
信息。
<property key="resource" value="workflows.xml" />
这个元素其实也可以不配置,如果不配置的话,默认就是workflows.xml,而且默认路径就是
classes下,或者是META-INF下,因此如果你不配置这个属性,请务必使用默认名称和默认路
径。
这个元素的配置意义,其实很明了,模型将在一定的条件下被重新解析和载入。这个元素同样也
是可以不配置的,默认情况下就是false的
<property key="reload" value="true"/>
第二个是workflows.xml文件,这个文件就非常的简单了,只要把例子贴出来,应该不需要做什么解释了:
<workflows>
<workflow name="simple" type="resource" location="oswk/test/config/simple.xml"/>
</workflows>
这个地方唯一要注意的就是:type属性,该属性可以被配置为三种类型:url、file、resource。这三种类型代表了三种文件的读取方式,来看看源代码:
if ("URL".equals(type)) {
try {
url = new URL(location);
File file = new File(url.getFile());
if (file.exists()) {
lastModified = file.lastModified();
}
} catch (Exception ex) {
}
} else if ("file".equals(type)) {
try {
File file = new File(location);
url = file.toURL();
lastModified = file.lastModified();
} catch (Exception ex) {
}
} else {
url=Thread.currentThread().getContextClassLoader().getResource(location);
}
最后一个文件就是流程模型文件了
workflow模型文件。
首先我们来熟悉一下workflow的基本概念。
简单的讲,workflow就是一个自动化流程引擎,我们把企业业务流程抽象出来,让workflow engine来统一管理和执行、监控。按照WFMC的定义:
全部或者部分,由计算机支持或自动处理的业务过程。
在不使用workflow engine的传统企业应用系统中,我们可能会散乱和抽象一些直接编写流程控制代码在业务系统中,这样的一种模式基本上是目前应用系统的主流模式。也许良好的体系架构足够的优秀,它抽象了很高层的逻辑来适应企业应用在未来的变化。
在我们面对一个应用系统进行较高层的设计时,总是在考虑如何才能将系统各个层面的依赖尽量的降低。从企业业务的角度来看,我们可以抽象出两个比较高层的层面:一是流程,二是活动。那么流程,就像是一条或者多条交错贯穿的线索,它连接着业务中各个结点的变化,线索的分支、合并等。而活动就是各个结点上发生的事情,这些发生的事情决定了线索的走向和状态。
系统架构设计的其中一个很重要的目的就是将系统中的层面尽可能的划分清晰,尽可能的松散耦合。那么我们如何才能把流程和活动清晰的划分呢?如何让流程牵引活动的执行呢?而活动对于流程来说是透明的,流程永远不知道在它上面的活动做了什么,它只需要流程得以继续流转的信息。同样,活动也并不知道流程的存在,它只提供活动执行的结果和其他信息。
那么,现在就很明确了,workflow就是这样一个东西,它定义了一个流程,并控制了整个流程的运行,安排活动在流程内部被呼叫,以及被定义了执行的顺序。
因此从workflow的视角来看,一个完整的流程就是一个实体,而这个实体的开始、运行、结束都被定义在workflow管理的一个规则模型中。接下来,我要分析的就是oswolkflow的这个模型定义,这里要表现的模型文件格式是开放的xml文件格式。
这个模型文件的的结构非常的复杂,里面包含了比较多的控制逻辑。来完成流程的运作。
如下是一个空的文件样式:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.7//EN"
"http://www.opensymphony.com/osworkflow/workflow_2_7.dtd">
<workflow>
<initial-actions>
</initial-actions>
<steps>
<step name="" id="1">
</step>
<step name="" id="4">
</step>
<step name="" id="5">
</step>
</steps>
</workflow>
这个样式提供了最基本的要素,我们通过initail-action来启动一个流程实例,然后在step里面定义活动来完成各个工作,查看dtd的定义
<!ELEMENT workflow (meta*, registers?, trigger-functions?, initial-actions, global-actions?, common-actions?, steps, splits?, joins?)>
根元素workflow中可以定义的子元素很多:
1、registers元素的作用是在外部调用流程实例的执行一些动作的时候,registers下的动作都将被调用,这个地方非常适合存放流程日志,来记录流程调用轨迹。可选,且只能有一个;
2、global-actions元素的作用其实从字面也可以很理解,就是一些全局的actions,它的存在是为了一些任何步骤都可能被执行的动作,它被放到了workflow根元素下面,在流程进入到任何step的时候,都可以执行这个元素下的actions。可选,且只能有一个;
3、trigger-functions元素的作用,这个元素是一个需要使用api执行的functions,适合系统外部被调用。可选,且只能有一个;
4、initial-actions元素的作用就更加的明确了,它就是一个流程实例被启动的时候需要执行的元素。必须
5、common-actions元素的作用,这个元素也被定义在全局的范围内,它的下面可以定义actions,被step内部的action以id的方式引用。可选,且只能有一个;
6、steps元素的作用基本算是最核心的元素了,每个流程的跳转都以这个元素为依据,这个里面我们会配置很多的actions来完各种动作。必须
7、splits我们在这个元素中配置需要并行执行的steps,完成了并行流程。可选,且只能有一个;
8、joins这个元素就是一个汇集了,我们可以把step中执行的action连接到这个元素,来完成多个actions执行完的其他处理,比如判断执行情况,来处理下一个step中的action。可选,且只能有一个。
转载请说明出处。该文档的版权属于http://zstzah.blog.bokee.net
----待续
分享到:
相关推荐
"osworkflow配置及演示程序.rar" 是一个包含有关OSWorkflow配置和示例应用程序的压缩文件。OSWorkflow(Open Source Workflow)是一个开源的工作流管理系统,它允许开发者在Java应用程序中实现复杂的业务流程。以下...
首先,我们来看看 `osworkflow配置` 这个知识点。OSWorkflow 的配置主要涉及以下几个方面: 1. **XML 配置文件**:OSWorkflow 使用 XML 文件来定义工作流的各个阶段、任务和流转规则。你需要理解如何编写和解析这些...
根据osworkflow自带的例子,自己写了个demo,简单地实现了工作流 有两个文件夹,一个是配置,一个是demo,里面有说明文件,可能写得不是特别详细,是本人学习过程中整理的 在下面环境中测试通过: mysql5.0 tomcat...
OSWorkflow的流程配置是通过XML文件来定义的,这使得流程设计可以与代码分离,便于维护和扩展。在你提供的文件列表中,`wfdemo6.xml`和`wfdemo5.xml`很可能是两个示例工作流定义文件。 工作流配置文件的核心在于...
7. OSWorkflow配置文件 - osworkflow.xml是OSWorkflow的配置文件,它描述了工作流的结构、步骤以及执行动作的条件和逻辑。 - 文件中可能还涉及了配置文件中各个元素的作用以及如何修改这些配置来满足特定的工作流...
osworkflow配置与demo.rar osworkflow中文开发指南.rar OSWorkflow中文手册OSWorkflow-chinese-manual-2.8.pdf Packt.Publishing.OSWorkflow.A.Guide.for.Java.Developers.and.Architects.Aug.2007.pdf 工作流普及...
在Java应用程序中,这通常通过在Spring配置文件中声明OSWorkflow的相关bean来完成。配置文件还会指定如何处理事务和错误。 四、API使用 OSWorkflow 提供了丰富的API,用于与工作流引擎交互。这些API包括用于启动和...
3. **OSWorkflow配置**:下载并解压OSWorkflow的源码,配置数据库连接信息,使其指向我们刚刚创建的数据库。 4. **流程定义**:理解并分析示例中的请假审批流程,这通常包含请假申请、部门主管审批、人事部门审批等...
**Osworkflow2.8.0+hibernate3.1.3+spring1.2.8集成环境配置安装指南.doc** 是一份详细的教程,指导读者如何设置和配置这三个组件的环境,包括下载、安装、配置文件的编写以及启动和测试等步骤。 **OSWorkflow-...
1. 配置:在项目中引入OSWorkFlow的依赖库,配置数据库连接,初始化工作流引擎。 2. 流程定义:使用提供的工具或编写XML定义工作流程。 3. 启动流程:通过引擎创建工作流实例,并启动流程。 4. 任务处理:根据流程...
4. "osworkflow配置与demo.rar":这可能是一个包含OSWorkflow配置示例和演示项目的压缩文件,通过解压并运行,你可以亲自动手实践,学习如何配置和执行工作流。 5. "WFMC.rar":很可能包含了WFMC的其他相关资料或...
OSWorkflow是一款开源的工作流引擎,主要用于管理应用程序中的复杂业务流程。这款工具提供了强大的工作流建模、执行和跟踪功能,让开发者能够灵活地定义和控制应用程序的流程逻辑。本手册是OSWorkflow的中文版,旨在...
### 关于OSWorkflow #### 一、概述 OSWorkflow是一款开源的工作流引擎,它为Java开发者和架构师提供了一个强大的工具来实现业务流程管理(BPM)。本书《OSWorkflow:Java开发人员和架构师集成开源业务流程管理指南...
3. **配置Spring**:在Spring配置文件中定义osworkflow的相关bean,包括WorkflowExecutor、PersistenceManager等,并配置事务管理器。 4. **配置Hibernate**:设置Hibernate的配置文件,建立与数据库的连接,并配置...
osWorkflow 就是这样一个系统,它提供了丰富的特性来支持动态和可配置的工作流程。 **osWorkflow 的主要特点** 1. **流程定义**:osWorkflow 提供了一个XML格式的流程定义语言,允许开发者以声明式的方式定义流程...
开发者需要根据项目需求进行配置,将OSWorkflow集成到应用中,这可能涉及到添加依赖、配置数据库连接以及初始化工作流表。 4. **API 使用** OSWorkflow 提供了一系列 Java API 和 XML 配置接口,用于创建、启动、...
1. **入门教程**:介绍如何安装和配置OSWorkflow,以及如何创建第一个工作流实例。 2. **API参考**:详细说明了OSWorkflow的各个类和接口,帮助开发者理解和使用API进行开发。 3. **最佳实践**:提供一些实际案例和...
10. **工作流设计工具**:虽然 OSWorkflow 本身不提供图形化设计工具,但有一些第三方工具(如 JBoss jBPM)可以用于可视化设计 OSWorkflow 流程,并生成相应的 XML 配置。 在 "osworkflow_bundle" 中,你可能会...
`osbuild.xml`可能是osWorkflow特定的构建脚本,而`build.xml`通常是Ant构建工具的配置文件,用于自动化编译、测试和打包过程。 4. **示例应用:osworkflow-2.8.0-example.war** 这是一个Web应用示例,展示了如何...
### OSWorkflow中文手册 2.8 #### 一、引言与基础知识 **OSWorkflow** 是一个开源的工作流引擎,用于实现业务流程自动化。它基于Java语言开发,并且支持多种数据库,具有高度的灵活性和扩展性。本手册旨在提供详细...