JBPM4.4源代码导读二(JBPM配置文件装配全过程)
本文详细描述JBPM4.4配置文件解析器
两个核心类:
Parser(解析器),有ConfigurationParser,BingParser等子类实现
Parse (运行时解析器助手,为解析器在运行时提供资源)
由于JBPM的xml文件中套xml文件,所有需要递归解析,最终会把解析后的资源信息存放到Bindings类中;
典型代码:
ConfigurationParser.getInstance()
.createParse()//转到运行时的Parse
.contextStackPush(this)
.setStreamSource(streamSource)
.execute()
.checkErrors("jbpm configuration " + streamSource);
这段代码中需要特别注意的是,createParse()方法中会new Parse(this);
在构造运行时Parse类的时候,传入的this是指当前调用方法的ConfigurationParser类;从而在调用运行时Parse类的execute方法时,执行的是ConfigurationParser类的parseDocument方法,并非是其父类Parse的parseDocument方法;同理,如果通过BingParser类调用方法的话,最终解析xml的具体操作就会在BingParser类中执行。
递归解析代码:
for (Element importElement : XmlUtil.elements(documentElement, "import")) {
if (importElement.hasAttribute("resource")) {
String resource = importElement.getAttribute("resource");//jbpm.default.cfg.xml
//根据resource 再次解析
Parse importParse = createParse()
.setResource(resource)
.contextStackPush(configuration)
.propagateContexMap(parse)
.execute();
parse.addProblems(importParse.getProblems());
}
}
我们在自己的项目中,需要解析xml文件的时候,也推荐使用这种方式;
我们可以在自己的类中依赖Parser解析器,添加如下代码,就可以获取一个xml文件的document对象,
private static Parser parser = new Parser();
//最好声明为static状态,只有声明为static状态,才能保证线程安全
Document document = parser.createParse()
.setResource("*.xml")
.execute()
.getDocument();
//待续。。。。。。越来越有意思了。。。。。
1 楼 Technoboy 2011-06-03 引用//最好声明为static状态,只有声明为static状态,才能保证线程安全
这句话,没太懂啊! 2 楼 herowj 2011-06-03 造成线程间不安全因素就是因为数据共享,声明为private static的话,不用new 一个实例就可以调用,我认为这样就不满足造成线程安全问题的基本条件,所以才可以保证线程安全。
个人理解。