Запросить ясность по XSLT Transformer TransformerFactory в многопоточной среде - PullRequest
0 голосов
/ 23 сентября 2019

Документация Transformer (https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newTransformer-javax.xml.transform.Source-) гласит:

Необходимо соблюдать осторожность, чтобы не использовать этот трансформатор в нескольких потоках, работающих одновременно.

  • Когда я использовал один и тот же объект Transformer в многопоточной среде, что могло произойти?
  • Почему мы не можем использовать один и тот же объект Transformer с двумя потоками?

Могу ли я кэшировать объект Transformer, если мой XSLT-источник фиксирован, так что во всех моих запросах будет использоваться один и тот же Transformer вместо его повторного создания при каждом запросе?

Ответы [ 2 ]

2 голосов
/ 24 сентября 2019

JAXP-классы, такие как Transformer, являются интерфейсами и имеют несколько реализаций (два наиболее широко используемых в наши дни - Xalan и Saxon).Фактический эффект нарушения правил многопоточности будет зависеть от того, какой процессор вы используете;но в обоих случаях они будут довольно непредсказуемыми.Transformer, скорее всего, будет содержать текущее состояние переменных и динамический контекст выполнения, поэтому вам не нужно, чтобы два преобразования записывали поверх переменных друг друга.

Чтобы избежать затрат на перекомпиляцию таблицы стилей для каждого использования, вам необходимокэшировать объект Templates, а не объект Transformer.Теоретически вы можете последовательно использовать Transformer для последовательного выполнения нескольких преобразований в одном потоке, но нет никакого смысла: просто создайте новый Transformer (из кэшированных шаблонов) для каждого нового преобразования.

Еще одна вещь, которую нужноизвестно, что DOM не поддерживает потоки даже в режиме только для чтения.Не допускайте одновременного доступа двух преобразований к одному и тому же дереву DOM.Если вам нужно совместно использовать исходный документ между несколькими преобразованиями, лучший способ сделать это зависит от того, используете ли вы Xalan или Saxon.

1 голос
/ 23 сентября 2019

Для компиляции и кэширования вашего фиксированного кода используйте newTemplates для создания объекта Templates, https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newTemplates-javax.xml.transform.Source-,, затем для каждого выполнения в многопоточной среде используйте newTransformer для объекта Templates для созданияновый Transformer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...