Прочитать большую строку XSLT в параллельном режиме

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
77
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если исходный код 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

Я бы обычно не помещал объект Templates в статический; это означает, что у вас может быть только один экземпляр в JVM.

Michael Kay 25.04.2018 01:15

@MichaelKay В том-то и дело. Единый общий экземпляр предварительно проанализированного файла XSLT, поэтому системе не нужно повторно анализировать его каждый раз, когда это необходимо. Поскольку вы тоже так говорите («сохраните скомпилированную таблицу стилей»), я не знаю, что должен был означать ваш комментарий.

Andreas 25.04.2018 01:29

Существует много дискуссий о том, когда уместно использовать статическое состояние по сравнению с одноэлементным шаблоном, например здесь: stackoverflow.com/questions/24214148/java-getinstance-vs-sta‌ tic, и я не хочу, чтобы здесь обсуждались эти дискуссии, просто чтобы сказать, что я всегда буду использовать для этого одноэлементный шаблон, если он не тривиальное однократное приложение.

Michael Kay 25.04.2018 09:40

@MichaelKay Я не понимаю вашего первого комментария. Шаблон синглтона также хранит синглтон в статическом поле, и по самой своей природе в JVM будет только один экземпляр синглтона. Итак, если вы говорите, что вы не будете использовать static, и что это означает, что у вас может быть только один экземпляр в JVM, тогда DUH, да, в этом был смысл. Если вы хотели сказать, что я должен был использовать шаблон singleton, то вы должны были сказать это, но этот первый комментарий был бессмысленным, особенно его вторая половина.

Andreas 25.04.2018 09:53

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

Другие вопросы по теме