文档的版权属于http://zstzah.blog.bokee.net
一 osworkflow的代码结构
首先来看看它的包的静态结构,
最早主要会提到的是basic、config、loader这三个包中的部分类,这三个包对于osworkflow的初始化非常重要。其中也会提到spi中的几个类,对于持久化操作的封装将使用这个包内的东西。
1、 basic 这个包中有两个类,BasicWorkflow,BasicWorkflowContext。如下我们来看看这两个类的继承体系:下面首先是workflow控制流程对象的继承体系
再来看看BasicWorkflowContext的继承体系:
这个包其实从名字上来看非常的明了,也就是我们从使用osworkflow的角度来看,一个流程实例的创建,我们可以使用的基本对象是BasicWorkflow,而我们同时也使用的BasicWorkflowContext这个对象来完成保存流程请求的用户的基本功能。
2、 config 这个包完成的工作就像他的名字一样,基本的两个配置类在这个包中:DefaultConfiguration、SpringConfiguration。我们来看看这个包的基本结构:
DefaultConfiguration这个类,完成了基本的配置文件的载入工作,包括osworkflow.xml(存放持久层配置以及流程工厂配置的文件)以及workflows.xml(存放流程模型资源的配置文件)的解析和映射。
我们来看看它的几个实例字段:
//流程工厂类,通常被配置到osworkflow.xml文件中,在初始化的时候会去寻找是不是配置了别的工厂,如果配置了,将替换这个工厂的引用
private AbstractWorkflowFactory factory = new URLWorkflowFactory();
//持久化信息的map,从配置文件中读出来,存放到这个map中
private Map persistenceArgs = new HashMap();
//完成持久化信息的各种工作的类全路径
private String persistenceClass;
//这个引用本身是一个接口,它将在初始化发生的时候,赋予它的子类实现,这个接口在类中直接被实例化成WorkflowStore这接口的实现类。具体使用什么实现类将在配置文件中配置。
private transient WorkflowStore store = null;
//这个是配置是否完成的标志字段,这个字段在load方法完成的时候,被设置为true
private boolean initialized;
SpringConfiguration这个类为和Spring的整合提供了支持,目前还没有对Spring整合进行分析,在这里暂时不进行分析,将在以后补充。
3、 loader 这个包,这个包中有大量的Descriptor,这些个描述符对象,记录了一个流程实例的步骤、动作、状态、名称等信息。由于这个类图过分庞大,因此不在这里出图例。这个类中也有一些关键的流程模型加载的工厂类,完成流程模型信息的初始化。我们在实际的应用中,只使用到了XMLWorkflowFactory,那么我们的流程配置文件自然也就使用了xml格式,在AbstractWorkflow中,大量的调用到了这个类的接口,来获取模型对象。这个类的详细分析,将放到以后的文档中。这里只要明白这个类是保存里流程模型对象的工厂,也就对模型进行一些操作,比如删除和保存一个流程模型。
4、 spi 这个包里面的东西也很多,主要我们会提到的是记录流程实例状态的对象、持久化真正实现的方式。先来看看实例状态对象的类图:
SimpleWorkflowEntry这个类,经常会用到,在流程启动和运行过程中,我们通常都使用这个类来标识流程实例的所对应的模型和实例状态。
5、还有就是真正操作持久类的对象Store
这里只把实际操作流程数据库的jdbc实现类图画出来。创建流程实例对象到数据库,操作流程实例相关的很多数据库数据。
二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