理解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,如xmlworkflowfactory、jdbcworkflowfactory、urlworkflowfactory、springworkflowfactory(在实际中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 spi指server provider identification
在spi包中可以看到各种存储的子包
里面具体代码还没细看,以后会慢慢完善!我想在load方法中将persistenceargs参数返回会在上面这些包的类中进行处理……
未完待续~~
闽公网安备 35060202000074号