osworkflow源码分析(一)

本文主要介绍了osworkflow.xml的加载过程,在DefaultConfiguration的load方法中通过getInputStream获取文件流,之后进行解析并加载相应工厂类。还提到了loader包下多种格式的factory,如xmlworkflowfactory等,实际调用workflowloader.load方法返回descriptor,spi包中存储子包代码待完善。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

理解osworkflow.xml

 

加载osworkflow.xml过程:
1)DefaultConfiguration
,load方法中调用getInputStream()以获取系统的osworkflow.xml文件

getInputStream方法中:

    protected InputStream getInputStream(URL url) {

        InputStream is = null;

 

        if (url != null) {

            try {

                is = url.openStream();

            } catch (Exception ex) {

            }

        }

 

        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

 

        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) {

            }

        }

 

        return is;

}

 

load方法中

Document doc = db.parse(is); //开始解析由上面方法传递回来的流

然后可以看到接下来通过xml中指定的工厂类进行init

 由上面代码可以看的出defaultconfiguration是如何加载osworkflow.xml的。

load()方法解析文件,load相应的工厂类.

 

workflowFactory

loader包下提供了多种多种格式的factory,如xmlworkflowfactoryJDBCworkflowfactoryURLworkflowfactoryspringworkflowfactory(在实际中jar包中没找到,但是在javadoc中确实有)等等。

这几种工厂类都是在各自的getWorkflow方法体内调用loadWorkflow方法。

    private void loadWorkflow(WorkflowConfig c) throws FactoryException {

        try {

            c.descriptor = WorkflowLoader.load(c.url);

        } catch (Exception e) {

            throw new FactoryException("Error in workflow descriptor: " + c.url, e);

        }

}

而实际调用的则是workflowloader.load方法。可以进一步跟踪到workflowloader中,可以看到如何是将descriptor返回的。

 

 

com.opensymphony.workflow.spi  spiserver provider identification
spi包中可以看到各种存储的子包

 

里面具体代码还没细看,以后会慢慢完善!我想在load方法中将persistenceArgs参数返回会在上面这些包的类中进行处理……

 

未完待续~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值