Читать большую строку XSLT параллельно - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть большая строка XSLT, которую я использую для преобразования XML в json. Я делаю это в веб-сервисе dropwizard, где очень важен параллелизм. Когда я сохраняю эту строку XSLT в файле, это приводит к тому, что все потоки веб-службы обращаются к файлу в последовательном порядке из файловой системы (таким образом, задерживая выполнение).

Если я пытаюсь сохранить этот XSLT как строку Java, я получаю исключение constant string too long. Как лучше всего хранить этот XSLT, чтобы мои потоки могли обращаться к нему параллельно?

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Вы не хотите компилировать один и тот же большой XSLT-файл более одного раза, даже если несколько компиляций выполняются параллельно. Скомпилируйте его во время инициализации веб-службы или по первой ссылке и сохраните скомпилированную таблицу стилей (объект Templates, если вы используете JAXP), чтобы ее можно было повторно использовать для нескольких преобразований. Объект Templates является поточно-ориентированным, поэтому несколько преобразований с использованием этой таблицы стилей могут выполняться одновременно.

0 голосов
/ 25 апреля 2018

Если источник XSLT действительно такой большой, вам, вероятно, следует сохранить его в файле, например, как ресурс classpath, и загружайте и анализируйте его только один раз:

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
...