服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

osworkflow源码分析(一)

理解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参数返回会在上面这些包的类中进行处理……

 

未完待续~~

扫描关注微信公众号