osworkflow分析(二)

在osworkflow中,关键的是3个xml文件:osworkflow.xml,workflows.xml, example.xml。
    其中osworkflow.xml中定义了persistence(持久化方式),factory:用来说明对example.xml文件的处理方式。如果定义为com.opensymphony.workflow.loader.XMLWorkflowFactory,也只是提供对流程定义的相关操作,如果设置为com.opensymphony.workflow.loader.JDBCWorkflowFactory,则会把example.xml的内容保存进数据库,这时,我们应该在数据库中进一个表,用来保存example.xml的定义信息.
      workflows.xml文件的定义只要看一下内容就可以理解,就是将各个流程定义文件在此进行“登记”(这是本人为了便于理解而想到的一个词),因为一个工作流引擎可以同时执行多个不同的流程。
  example.xml就是系统运转的依据--流程定义文件。
  
下面简单介绍一下流程引擎分别什么时候,怎样对这3个xml文件进行处理。
  osworkflow.xml主要由DefaultConfiguration类来处理,从osworkflow.xml的定义中我们可以看出它是关联着workflows.xml文件的。在osworkflow中是怎么体现这种联系的呢? 在 DefaultConfiguration类中的一项属性是
private WorkflowFactory factory = new URLWorkflowFactory(); 对流程定义文件的处理就交由factory来处理。
  对osworkflow.xml文件的处理放在public void load(URL url)方法中,
   对osworkflow.xml文件将依下面的顺序依次进行查找,并解释。  
  Specified URL
     osworkflow.xml
     /osworkflow.xml
     META-INF/osworkflow.xml
     /META-INF/osworkflow.xml
  其中会根据factory element中class的属性instance一个相应的factory.
  clazz = factoryElement.getAttribute("class");
factory = (WorkflowFactory) ClassLoaderUtil.loadClass(clazz, getClass()).newInstance();

随后会调用factory .initDone()来进行一些操作。在XMLWorkflowFactory 是会对workflows.xml进行解释,并将各个流程定义的关系放在 HashMap workflows中。key放的是name属性中的值,而value中是WorkflowConfig有以下 属性:
  String location;
        String type; // file, URL, service
        URL url;
        WorkflowDescriptor descriptor;
        long lastModified;
  
如果type为URL,或者file,则会new 一个file,得到它的lastModified.当是resource时,则lastModified不会被赋新的值。lastModified在哪会被用到,暂时不清楚。
factory .initDone() 结束后,整个load过程也就结束。

这时,我们知道在DefaultConfiguration的load过程中,我们已经创建相应的factory, 并解释了调用factory的initDone()把流程的name,WorkflowConfig放在了hashmap workflows中。我们注意到此时,WorkflowConfig中的WorkflowDescriptor descriptor;是空的,就表示还没有对example.xml进行解释,未赋任何信息。
那对example.xml的解释又是什么时候,在哪个类中进行的呢?

 接昨天的分析继续

在package com.opensymphony.workflow.loader;包下有一个WorkflowLoader类,它的主要任务就是从各种来源的xml文件创建WorkflowDescriptor类。WorkflowLoader类中主要的方法就是一些override的load()方法,最后这些override的load()方法,都会调用一个private load()来处理。在private load()中,并没有直接 new WorkflowDescriptor(root),而是动用了工厂模式,WorkflowDescriptor descriptor = DescriptorFactory.getFactory().createWorkflowDescriptor(root)。
至此可以做个简单的总结:
  osworkflow.xml----DefaultConfiguration 在load(URL)方法中进行加载
  workflows.xml------------WorkflowFactory (子类有XMLWorkflowFactory)在 initDone()中进行处理
  example.xml----------  WorkflowDescriptor

因为在workflows.xml中关于一个流程定义文件是这样定义的:
 <workflow name="example" type="resource" location="example.xml"/>
  在这里有一个,WorkflowConfig来封装这些信息,为了和example.xml的关联类WorkflowDescriptor 联系,在,WorkflowConfig有一项attribute是WorkflowDescriptor 用来某一workflow的WorkflowDescriptor .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值