我在处理一些 AJAX POST 请求时遇到间歇性超时。设置:Apache 2.2.17 -> mod_jk 1.2.26 -> JBoss 4.3 CP01(带有 Tomcat 6.0)。应用程序使用 JSF 1.2_11、Seam 2.1、RichFaces 3.3.1 构建。
它通常发生在 IE 浏览器 (7,8,9) 上。浏览器发送一个 ajax 请求(RichFaces 为此生成 JavaScript 代码)。这个 HTTP POST 请求被 mod_jk 转换为 AJP Header 和 body 数据包并发送到 Tomcat。头包说内容长度为1760,但主体包的长度字段为0,没有内容。使用 tcpdump 捕获数据包。0 ajp 正文数据包不会发生在每个有问题的请求中。所有 ajax 请求/响应都很小,最多 30K,没有文件上传,也没有冗长的数据库查询。
在这个阶段,mod_jk 日志显示请求在 2 分钟内处理完毕。在我们的测试环境中,我们也得到了 2、3、4 和 6 分钟。包装请求的应用程序过滤器也显示 2 分钟时间;过滤器很简单——在请求之前和之后获取时间戳并记录差异。
调用应用程序的 JSF 阶段侦听器,每个阶段(请求、视图恢复、验证、调用、渲染)大约需要 100 毫秒 - 通常用于应用程序。因此超时必须发生在请求开始(过滤器之后和第一个 JSF 阶段之前)或结束(渲染 JSF 阶段之后和过滤器结束之前)之间。
有时,mod_jk 说客户端读取超时;谁是客户端 - 浏览器,apache?在 JBoss 中,在 DEBUG 级别没有记录异常。
有人遇到过类似的事情吗?mod_jk reply_timeout 设置不能解决问题。直接连接到 JBoss 会给我们带来大约 30 秒的超时,这是我们以前从未见过的,我们不知道它是否与 2 分钟的超时有关。