Модификации XML с эффективным использованием памяти в Spring MVC

Приведенный ниже метод вернет XML-ответ, в котором некоторые значения атрибутов предварительно и постфиксированы. Попробовав STAX, я попробовал TRAX для преобразования XML. Что я могу сделать, чтобы уменьшить нагрузку на память?

import org.springframework.core.io.ClassPathResource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.client.RestTemplate;

import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.ByteArrayInputStream;
import java.io.IOException;

@RestController
public class MyController {

@RequestMapping
public void get(HttpServletResponse response) throws IOException, TransformerException {

    LOGGER.info("Total {} mb", Runtime.getRuntime().totalMemory()/1000000);
    LOGGER.info("Free {} mb", Runtime.getRuntime().freeMemory()/1000000);
    LOGGER.info("Used {} mb", (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/1000000);

    StreamSource xml = new StreamSource(new URL("http://remote.domain/big.xml").openStream());
    TransformerFactory factory = TransformerFactory.newInstance();
    Source xsl = new StreamSource(new ClassPathResource("transform.xsl").getInputStream());
    Result result = new StreamResult(response.getOutputStream());
    Transformer transformer = factory.newTransformer(xsl);
    transformer.setParameter("prefix", "BEFORE");
    transformer.setParameter("postfix", "AFTER");
    response.setContentType("application/xml");
    response.setHeader("Content-Disposition", "attachment; filename=updated.xml" );
    transformer.transform(xml, result);
    response.flushBuffer();

    LOGGER.info("Total {} mb", Runtime.getRuntime().totalMemory()/1000000);
    LOGGER.info("Free {} mb", Runtime.getRuntime().freeMemory()/1000000);
    LOGGER.info("Used {} mb", (Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory())/1000000);

}
}

Обратите внимание, что xsl обычно загружается один раз. Для удобочитаемости в этом методе все вместе сложил.

РЕДАКТИРОВАТЬ Если я вызову метод несколько раз, я получу java.lang.OutOfMemoryError: Java heap space. Так что я вообще не думаю, что это потоковая передача.

XSLT 1 и 2 используют модель данных, которая включает сначала анализ входного XML-документа в древовидную модель, чтобы разрешить произвольную навигацию XPath, поэтому я не понимаю, почему вы ожидаете какой-либо потоковой передачи. XSLT 3, опубликованный в прошлом году, представляет подмножество языка для потоковой обработки, насколько мне известно в мире Java, только Saxon 9.8 EE поддерживает это. Итак, чтобы использовать потоковую передачу с XSLT 3, вы оба должны переписать свой XSLT-код для прохождения анализа потоковой передачи, а также приобрести (по крайней мере, пробную или купить коммерческую) лицензию для Saxon 9 EE.

Martin Honnen 06.04.2018 16:00

@MartinHonnen Спасибо

codesmith 06.04.2018 16:33

Кроме того, если вы переходите на Saxon 9 EE и хотите продолжить использование JAXP, вам необходимо убедиться, что вы используете saxonica.com/html/documentation/javadoc/com/saxonica/config/‌… в качестве TransformerFactory.

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

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