РЕДАКТИРОВАТЬ: чтобы поднять обсуждение комментариев к этому ответу - это может быть то, что вы после
Если вы застряли в унаследованном приложении даже без разделения обработки (контроллер) и представления (jsp), вам следует ограничить обработку самыми первыми инструкциями на jsp, например, прямо на вершине. Там вы даже можете свободно перенаправить (например, отправить обратно код ответа 302), не говоря уже о том, чтобы сигнализировать об ошибках с правильным кодом ошибки. Тем не менее, вы все равно должны избегать представления 500 ошибок стиля вашим клиентам. Скорее предоставьте симпатичную HTML-страницу (200), отображающую полезное сообщение об ошибке клиенту. Приложения должны отображать свои ошибки на своем уровне, а не на уровне протокола.
Помню, еще в прошлом веке я сам работал над таким приложением. Мы испытали некоторые различия в платформах: одна платформа не буферизировала даже первый байт, но немедленно отправила его обратно клиенту, что сделало наши попытки перенаправления (код 302) бесполезными, так как заголовок с 200 кодами уже был в пути. Единственное, что помогло, - убедиться, что ни один байт не мог быть отправлен до обработки. Поскольку нам потребовалось несколько меток, мы должны были устранить разрывы строк между инструкциями меток. Есть два способа сделать это:
Вместо
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>
<% /* your processing instructions here */
response.sendRedirect("somewhere.jsp") %>
запись * * 1 010
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"
%><%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt"
%><% /* your processing instructions here */
response.sendRedirect("somewhere.jsp") %>
или используйте комментарии jsp для устранения разрывов строк:
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %><%--
--%><%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt"%><%--
--%><% /* your processing instructions here */
response.sendRedirect("somewhere.jsp") %>
Это может показаться уродливым, но значительно снижает опасность сброса буфера сервером - независимо от его размера.
Надеюсь, это поможет.
Это ответ на вопрос до / во время обсуждения комментариев
Документы Tomcat для коннектора http имеют bufferSize, socketBuffer и еще несколько опций для установки nio - некоторые для ввода и некоторые для потоков вывода. Разъем AJP , по-видимому, не настраивается (вам нужен разъем ajp, если вы используете Apache / mod_jk).
Я надеюсь, что буфер, который вы ищете, находится среди этих ...
РЕДАКТИРОВАТЬ: (Место для комментариев было слишком мало, поэтому я решил добавить еще немного информации относительно вашего комментария, что вы используете AJP здесь:)
Мнение о размерах буфера, по-видимому, реализовано (из краткого обзора исходного кода tomcat 6.0.18) в org.apache.catalina.connector.OutputBuffer и в org.apache.catalina.connector.Response. Особый интерес представляет этот фрагмент кода (из Ответа):
/**
* Set the Connector through which this Request was received.
*
* @param connector The new connector
*/
public void setConnector(Connector connector) {
this.connector = connector;
if("AJP/1.3".equals(connector.getProtocol())) {
// default size to size of one ajp-packet
outputBuffer = new OutputBuffer(8184);
} else {
outputBuffer = new OutputBuffer();
}
outputStream = new CoyoteOutputStream(outputBuffer);
writer = new CoyoteWriter(outputBuffer);
}
Исходя из моего суждения об этом куске кода, кажется, что увеличение размера буфера может не очень помочь в ваших проблемах. Не то чтобы я хотел сказать, что это не помогает ... Вы измеряли реальную производительность, когда увеличивали размер буфера из jsps? Помогает ли это сделать?
Зная эту точку контакта, вам может потребоваться либо установить исправление источника tomcat, либо добавить фильтр в ваше веб-приложение или конфигурацию контейнера tomcat, который подгоняет размер буфера в соответствии с вашими потребностями. (Я бы предпочел фильтр над патчем Tomcat в любое время)
Еще одна мысль, которая приходит мне в голову: если вы используете какую-либо систему шаблонов (например, плитки, как вы упоминаете jsp, но скорость или другие приходят на ум), у вас не должно быть слишком много точек, где вам придется установить размер буфера от jsps. В системах, над которыми я работал, я бы предположил, что это затронет около 10 базовых шаблонов макетов (независимо от размера проекта).
Надеюсь, это дополнение поможет ...