理解osworkflow.xml:
加载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
里面具体代码还没细看,以后会慢慢完善!我想在load方法中将persistenceArgs参数返回会在上面这些包的类中进行处理…… |
|