JBoss потоковый ввод / вывод - PullRequest
1 голос
/ 31 марта 2011

Я имею дело с приложением на основе Spring MVC, развернутым под JBoss-4.2.3.GA, и хочу уточнить, как потоковый ввод / вывод сервлета работает с огромным телом запросов / ответов. Я беспокоюсь об этом, потому что не хочу хранить весь запрос / ответ в памяти, пока вызов не будет полностью завершен.

Как я могу точно определить реализацию потока ввода / вывода, которую JBoss передает сервлету? Или возможно я могу исследовать его поведение в какой-то спецификации?

Спасибо за любую полезную информацию об этом.

1 Ответ

1 голос
/ 31 марта 2011

API сервлета по умолчанию не сохраняет в памяти весь текст запроса и ответа. Это эффективно ваш собственный код обработки / анализа, который делает это.

Что касается тел запроса, при обработке его не следует хранить все тело в byte[]. Каждый байт byte[] потребляет, да, один байт памяти Java. Вы должны попытаться (пере) написать свой код так, чтобы он никогда не занимал все тело в памяти. Обработайте его, например, построчно или от буфера к буферу и / или немедленно передайте в OutputStream.

например. когда тело основано на символах:

BufferedReader reader = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
PrintWriter writer = new PrintWriter(new OutputStreamWriter(someOutputStream, "UTF-8"));

for (String line; (line = reader.readLine()) != null;) {
    processIfNecessary(line);
    writer.writeln(line);
}

или когда тело основано на байтах:

BufferedInputStream input = new BufferedInputStream(request.getInputStream());
BufferedOutputStream output = new BufferedOutputStream(someOutputStream);
byte[] buffer = new byte[1024]; // 1KB buffer.

for (int length; (length = input.read(buffer)) > 0;) {
    processIfNecessary(buffer);
    output.write(buffer, 0, length);
}

Что касается тел ответа, он будет храниться в памяти до размера буфера. Все, что больше размера буфера, будет сброшено. Размер буфера по умолчанию обычно составляет 2 КБ. Это настраивается на уровне приложений и ServletResponse#setBufferSize(). Если вы установите слишком большой размер буфера, он поглотит память.

...