В этой статье (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();
}
Вы можете попробовать запустить его под Saxon вместо механизма преобразования JDK по умолчанию. Кроме того (но, возможно, это не связано), если вы многократно запускаете это преобразование, вам следует создавать объекты TransformerFactory и Templates только один раз, а затем создавать новый Transformer для каждого преобразования.




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