Отключить кеширование в преобразователе Javax xml

В этой статье (https://www.ahoi-it.de/ahoi/news/java-xslt-memory-leak/4830) объясняется, что преобразователь Javax xml кэширует содержимое XML в свой внутренний HashMap для последующего использования.

Это моя проблема: я читаю XML-сообщения из activemq, и если что-то не получается, я снова пытаюсь преобразовать их с помощью преобразователя Javax XML и отправить их в определенную конечную точку. Проблема в том, что в конце концов мой контейнер Docker перезапускается, потому что ему не хватает памяти.

Что я хотел бы сделать, так это отключить кеширование, к сожалению, после 3 часов исследований я до сих пор не знаю, как это сделать.

У меня есть класс utils со статическими методами, и вот как выглядит мой Javax XML Transformer:

public static String getTransformedXml(Object input, String transformerFileName)
        throws IOException, TransformerException {
    ClassPathResource classPathResource = new ClassPathResource(transformerFileName);
    InputStream xsltStream = classPathResource.getInputStream();

    TransformerFactory factory = TransformerFactory.newInstance();
    Source xslt = new StreamSource(xsltStream);
    Transformer transformer = factory.newTransformer(xslt);
    transformer.setErrorListener(new XsltTransformerErrorListener(transformerFileName));

    Source text = new StreamSource(new StringReader(XmlUtils.encode(input, input.getClass())));
    StringWriter writer = new StringWriter();
    StreamResult result = new StreamResult(writer);

    transformer.transform(text, result);

    return result.getWriter().toString();
}

Вы пытались преобразовать один файл XML в другой в свой собственный поток?

Vebbie 17.01.2019 14:59

Вы можете попробовать запустить его под Saxon вместо механизма преобразования JDK по умолчанию. Кроме того (но, возможно, это не связано), если вы многократно запускаете это преобразование, вам следует создавать объекты TransformerFactory и Templates только один раз, а затем создавать новый Transformer для каждого преобразования.

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

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