一段时间后,Tomcat 停止使用其他 API

After a while, Tomcat ceases working with other APIs

我正在努力使项目更加稳定。问题是在某些时候会出现所有使用与其他 API 通信的代码都停止工作的情况。直到我重新启动 tomcat,我每隔几个小时(从 4 小时到几分钟,这似乎取决于用户数量)必须做的事情。同时,接受 GET(或任何其他)请求并且在 activity 期间不联系其他服务器的代码 - 它继续工作。与其他服务器和此服务器上的其他项目的通信丢失。

服务器Ubuntu12.04,nginx 1.12.0,tomcat9.0.0.M26。 服务器在 java 上有 12 个小项目。 Spring 5.0.4.RELEASE、休眠 5.2.16.Final、(PostgreSQL) 9.6.3

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.NullPointerException

org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

我还在不同的地方和不同的类型中遇到许多其他错误,最常见的是 NPE(因为由于缺乏通信,我想要从另一台服务器获取的对象 = null),有时我会收到 HttpClientErrorException 和状态 400,尽管远程服务器总是以 200 的状态响应类似的请求。 在我的本地tomcat,我从来没有遇到过类似的情况。我已经为这个问题困扰了很长时间,情况越来越糟(更多用户 - 它中断得更快),我将不胜感激任何建议。我为 Google 翻译道歉。

来自 jstack 的线程转储 - threaddumps.log

下面是jvisualvm threads在代码不起作用的时候

Thread dump a few seconds before everything breaks

Thread dump at the time the code does not work

尝试升级到 Tomcat 9.0.6。在 9.0.0 和 9.0.6 之间修复了几个错误。

相当多,它显示了 "connection configuration" 与负载平衡相关的所有迹象。

正如您所说,当它获得大量用户时,它就会这样做。 但是,它似乎在某些网络请求中使用了某种类型的序列化 RMI 对象

序列化对象是 java class 个对象,然后 "after loading onto the stack ready" 将其移除到一个特殊的包中以通过网络传输,类似于移除车辆的运转引擎并在其运行时将其移除运行 并将其放置在另一辆发动机舱为空的车辆中以在其 运行.

时连接它

RMI 被称为 "Remote Method Invocation",这意味着使用 pre-loaded 运行 java [在另一台远程计算机上处​​理实时运行的 JVM 是一种非常慎重的行为] classes 从另一台机器上的 JVM 运行 通过网络进入另一个实时 JVM!?

解决方案是将 RestTemplate 声明从全局移动到本地。除了RestTemplate中添加的"application/json"值外,还自动添加了"text/plain"和“/”。 在我的 class 中,收集了 API 访问方法,每次使用 RestTemplate 都会导致添加此信息,结果是 header 增长,直到我收到 "Request Header Or Cookie Too Large".

这个应该多注意一些是对的,但是症状很奇怪,让我很困惑。 现在我明白了,所有项目同时崩溃只是巧合,因为对其他服务器的调用次数大致相等。 重新加载 tomcat 有帮助,因为 header 一开始是干净的。 现在每个方法都会创建自己的 RestTemplate 实例,并且不会在 header.

中累积这些添加的信息

感谢所有在聊天中帮助我并帮助我做出决定的人。 我还想指出这个问题(及其答案)在我的情况下非常有用 - Spring RestTemplate - how to enable full debugging/logging of requests/responses?