代码之家  ›  专栏  ›  技术社区  ›  Adi

并行读取大型XSLT字符串

  •  0
  • Adi  · 技术社区  · 6 年前

    我有一个很大的XSLT字符串,用于将XML转换为json。我是在dropwizard webservice中完成这项工作的,这里非常需要并发性。当我将此XSLT字符串存储在文件中时,它会导致所有webservice线程从文件系统按顺序访问该文件(从而延迟执行)。

    如果我尝试将XSLT存储为java字符串,我会得到 constant string too long 例外存储此XSLT以便线程可以并行访问它的最佳方式是什么?

    2 回复  |  直到 6 年前
        1
  •  3
  •   Andreas dfa    6 年前

    如果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
    
        2
  •  2
  •   Michael Kay    6 年前

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