并行读取大型XSLT字符串

时间:2018-04-24 22:49:05

标签: java file xslt parallel-processing

我有一个大的XSLT字符串,我用它来将XML转换为json。我在一个dropwizard webservice中这样做,其中非常需要并发。当我将此XSLT字符串存储在文件中时,它会导致所有Web服务线程按顺序从文件系统访问文件(从而延迟执行)。

如果我尝试将该XSLT存储为java字符串,则会出现constant string too long异常。我可以存储此XSLT的最佳方式是什么,以便我的线程可以并行访问它?

2 个答案:

答案 0 :(得分:3)

如果XSLT源真的那么大,你应该将它存储在一个文件中,例如:作为类路径资源,只加载并解析一次:

private static Templates largeTemplate;

初始化使用(仅限一次):

try (InputStream in = Test.class.getResourceAsStream("path/to/large.xslt")) {
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    largeTemplate = transformerFactory.newTemplates(new StreamSource(in));
}

然后为每个帖子:

Transformer transformer = largeTemplate.newTransformer();
// Use transformer here

答案 1 :(得分:2)

您不想多次编译同一个大型XSLT文件,即使多个编译并行完成也是如此。在初始化Web服务期间或在第一次引用时编译它,并保存已编译的样式表(如果您正在使用JAXP,则为Templates对象),以便可以将其重用于多个转换。 Templates对象是线程安全的,因此使用此样式表的多个转换可以同时运行。