在多线程环境中要求TransformerFactory的XSLT Transformer清晰

时间:2019-09-23 17:58:26

标签: java xml xslt transformation

《变形金刚》文档(github)说

  

必须注意不要在同时运行的多个线程中使用此Transformer。

  • 当我在多线程环境中使用相同的Transformer对象时,会发生什么?
  • 为什么我们不能同时使用2个线程的Transformer Object?

如果我的XSLT源是固定的,是否可以缓存Transformer对象,以便我的所有请求都将使用相同的Transformer,而不是在每个请求上都重新创建它?

2 个答案:

答案 0 :(得分:2)

诸如Transformer之类的JAXP类是接口,并且它们具有多种实现(当今最广泛使用的两个是Xalan和Saxon)。违反多线程规则的实际效果将取决于您使用的处理器。但在两种情况下,它们都是不可预测的。 Transformer可能会保留变量的当前状态和动态执行上下文,因此您真的不希望两次转换都覆盖彼此的变量。

为避免每次使用都重新编译样式表的开销,您需要缓存Templates对象,而不是Transformer对象。从理论上讲,您可以在一个线程内串行使用Transformer来串行执行多个转换,但没有意义:只需为每个新转换创建一个新的Transformer(从缓存的Templates)。

要注意的另一件事是,即使在只读模式下,DOM也不是线程安全的。不允许两个转换同时访问同一DOM树。如果确实需要在多个转换之间共享源文档,则最终的最佳处理方法取决于使用Xalan还是Saxon。

答案 1 :(得分:1)

要编译和缓存您的固定代码,请使用newTemplates创建一个Templates对象https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newTemplates-javax.xml.transform.Source-,然后对于多线程环境中的每次执行,请在{ newTransformer对象来创建新的Templates