问题描述
我正在开发用于XSD验证的应用程序,并且希望将我的架构进行缓存。
另一方面,应用程序使用多个线程,所以我想知道什么是线程安全的方法来加载XSD文件。
目前,我为每个XSD创建了一个新的 net.sf.saxon.s9api.Processor 。之后, SchemaManager 用于验证大量xmls
Processor processor = new Processor(true);
SchemaManager sm = processor.getSchemaManager();
sm.load(new StreamSource(new File(xsdFilename)));
真的有必要吗?我可以实例化一个 Processor 并将其用于所有XSD吗?那么在这种情况下在多线程上下文中获取SM是否安全?
此外,将 SchemaManager 实例存储在表示应用程序缓存的Map中是否正确?还是应该使用 SchemaValidator 对象?
解决方法
Saxon Processor和SchemaManager可用于存储多个模式(或更确切地说,一个模式是多个模式文档中所有模式组件的并集),并且是线程安全的,因此只要所有模式是兼容的。我的意思是说,您不能有两个具有相同名称的不同架构组件,例如加载不同的无命名空间模式的结果,或者使用xs:redefines的结果。
但是,如果要将模式分开,则每个模式都需要一个不同的org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced or misused argument matcher detected here:
和Processor
。
SchemaManager
对象不是线程安全的:您应该为每个验证任务创建一个新的SchemaValidator
。创建该对象很便宜。
还值得注意的是,在某些极端情况下,即使“模式”的多个部分不相交,针对“复合”模式进行验证也可能会更改验证结果:例如,当元素通配符具有{{1}}或SchemaValidator
。