当前位置: 首页 > 知识库问答 >
问题:

当服务器认为HTTP GET to localhost响应时,什么会导致HTTP GET to localhost超时?

李谦
2023-03-14

我有一个在AWS Beanstek(Tomcat 8.5 Apache httpd)中运行的Java应用程序。

在某一点上,应用程序调用本地主机上的RESTendpoint。

偶尔我在日志中看到这样的失败:

14:55:45 ... SEVERE: url[http://localhost/detail.api?id=200030599] timing=12.010 ...

这表明我的CustomRestTemplate在12秒后放弃了等待响应。

但是,查看日志中的几行,我看到了来自服务endpoint的日志条目:

{
    "server_ts": "2020-08-19T14:55:33.890Z",
    "remote_ip": "127.0.0.1",
    "local_ip": "127.0.0.1",
    "method": "GET",
    "url": "/detail.api",
    "query_string": "?id=200030599",
    "protocol": "HTTP/1.1",
    "http_status": 200,
    "referer": null,
    "user_agent": "Apache-HttpClient/4.5.2 (Java/1.8.0_252)",
    "time_elapsed": 5,
    "thread_name": "http-nio-8080-exec-20",
    "host": "localhost",
}

这是我的自定义servlet记录器,显示5毫秒的响应。这是从外部包装Servlet Filter记录的。

这个问题反复出现,但足够罕见,我无法重现。所以我需要采取一种智力方法......开发一系列假设和测试来反驳每一个假设,直到找到正确的假设。

可能的原因是什么?

到目前为止我试过什么

我编写了自定义记录器,这样我就可以捕获上面显示的时间。然后我基本上碰壁了,因为超时发生在“服务器”(localhostendpoint)发送的响应和客户端读取的响应之间的某个隐藏维度上。

我看到Apache日志(来自elasticbeanstack)也显示了本地请求:

127.0.0.1 (-) - - [19/Aug/2020:14:55:33 +0000] "GET /detail.api?id=200030599 HTTP/1.1" 200 4982 "-" "Apache-HttpClient/4.5.2 (Java/1.8.0_252)"

共有1个答案

于捷
2023-03-14

最后,我能够使用JMeter在本地测试中再现这个问题。

事实证明,“隐藏维度”隐藏在Servlet过滤器中:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    
    long started = System.currentTimeMillis(); 

    chain.doFilter(request, response);
    
    long elapsed = System.currentTimeMillis() - started;
    
    log(request, response, elapsed);

}

调用包含一个同步数据库插入,该插入会减慢速度,并在负载下最终失败。我假设servlet引擎保持连接打开,直到这个过滤器返回。调查现在继续寻找解决方案。

 类似资料:
  • 我有一个ColdFusion事件网关,有时会在以下行产生错误(其中Local.cur线程是数字1-5): 错误是: 消息:超时值为负。类型:java。lang.IllegalArgumentException 这是StackTrace: Java语言lang.IllegalArgumentException:java的超时值为负。lang.Object。在coldfusion上等待(本机方法)。运

  • 我的nginx版本是: 我的应用程序安装在 当我访问 它工作正常。这是因为服务器根设置为; 现在我想使用。当我将服务器根目录更改为并键入上述URL时,它会使用http 302重定向到 这可能是什么原因? 然后,它将应用我的应用程序中的其他规则。conf并给出一个404。 我在访问日志中看到: 我的conf文件是:

  • 问题内容: 命令的帮助菜单显示该选项是选择“服务器” VM。它还指出“服务器”是默认选项。为什么这么多余? 编辑: 如果有帮助,“ java -version”将产生: 问题答案: 并在现代JVM上被 忽略, 就这么简单。有两种 编译器 和,但也有5 层 ,整个荣耀所有的细节都在这里的评论。 使用这些标志来控制如何以及将采取行动-禁用与否; 现在由另外两个标志控制:-

  • 好的,正如你所看到的,即使我将等待时间设置为0.1秒,仍然没有引发超时异常。当执行时,它不会阻塞,直到整个页面加载完毕,这就是为什么出现了,令我惊讶的是,等到整个页面加载。如果使用,则会得到相同的结果。 我的观点是,有时候在你点击一个元素之后,可能会因为一个坏的代理而需要几个小时才能加载一个页面,而且你显然不想等待那么长时间,你想要的是一个超时异常。在这种情况下,您将如何使其工作?

  • 我的模拟模型中有在GIS空间漫游的代理。我建立了一个参数变化实验来产生复制。在运行期间,我收到了四条通知,“服务器没有响应。连接超时。”然而,模拟一直在运行,它仍然产生了结果。这个错误的影响是什么?为什么会这样? 我的路由是从开源地图服务器请求的,路由服务器选项是AnyLogic。

  • Logcat消息: java.lang.IllegalStateException:在Android的父上下文或祖先上下文中找不到方法@={()->ViewModel.OnBtnClicked()(View):在id为“button”的视图类AndroidX.AppCompat.Widget.AppCompatButton上定义的OnClick属性 文件1:activity_main.xml 文件