Tomcat 6 默认缓冲区大小

3
有没有一种方法可以在Tomcat中设置JSP的默认缓冲区大小?我知道我可以在每个页面上设置它们,但希望有一个全局选项。
2个回答

3
短答案:不行。
长答案:也许可以通过一些黑客手段实现...
您需要在编辑以下类后自己构建Tomcat:Jasper常量 或者,您可以使用Perl pie,一次性编辑所有JSP。请先备份,因为此操作会进行内联编辑。
对于没有缓冲区设置的指令:
/usr/bin/perl -pi -e 's|<%@ page|<%@ page buffer="new" |g' `find . -type f -name '*.jsp'`

对于已设置的缓冲区:

/usr/bin/perl -pi -e 's|buffer="old"|buffer="new"|g' `find . -type f -name '*.jsp'`

如果您的指令与上述内容不一致,例如有更多/更少的空格,请使用更多的正则表达式技巧使其正常运行。

您在其他网站上遇到的问题: http://www.theserverside.com/discussions/thread.tss?thread_id=24768

希望对您有所帮助


这基本上就是我们最终所做的。 - hlavka
构建Tomcat,还是Perl饼? - opyate

2

编辑:为了把评论讨论提升到这个答案——这可能是你要找的

当你被困在一个没有处理(控制器)和视图(jsp)分离的遗留应用程序中时,你应该将处理限制在jsp的最初指令上,例如位于顶部。在那里,你甚至可以自由重定向(例如发送回响应代码302),更不用说用正确的错误代码来发出错误信号。话虽如此,你应该尽量避免向客户呈现500风格的错误。相反,应用程序应在其级别上显示其错误,而不是在协议级别上。

我记得,在上个世纪,我曾经亲自处理过这样一个应用程序。我们曾经遇到过一些平台差异:一个平台甚至没有缓冲第一个字节,而是立即将其发送回给客户端,使我们的重定向尝试(代码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") %>

撰写

<%@ 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连接器似乎不太可配置(如果使用Apache/mod_jk,则需要ajp连接器)。

我希望你要找的缓冲区在其中之一…

编辑:(评论空间太小,所以我选择添加有关您在此处使用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源代码或向您的Web应用程序或tomcat容器配置添加过滤器来根据您的需求调整缓冲区大小。 (我随时都会选择过滤器而不是tomcat补丁)
我想到的另一个主意是:如果您使用任何模板系统(例如tiles,因为您提到jsp,但velocity或其他系统也可以),则不应该有太多需要从jsps设置缓冲区大小的点。在我工作的系统中,独立于项目大小,我可能会猜测大约有10个基本布局模板会受到影响。
我希望这个补充有所帮助...

我们使用AJP连接器,所以没有运气。 - hlavka
我已经编辑了我的回答以反映这个方面,请在那里阅读。 - Olaf Kock
我们试图解决的真正问题是,一旦缓冲区刷新,我们就无法再进行重定向。这意味着在第一次刷新之后发生的500错误不会被重定向到我们的500页面,并且在访问日志中也不会报告为500错误。 - hlavka
好的,明白了。为什么你不问这个问题呢?;-) 我不会尝试使用缓冲区大小来解决这个问题-这会严重限制你的可扩展性。当jsp正在显示时,应该完成处理工作,并且不应该发生500错误-只允许出现视觉上的错误。你在使用什么环境/框架? - Olaf Kock
你说得对... 我应该从这里开始。这是遗留代码 - 没有框架,直接使用JSP。 - hlavka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接