2

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

服务器 Ubuntu 12.04,nginx 1.12.0,tomcat 9.0.0.M26。服务器上有 12 个关于 java 的小项目。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 上,我从来没有遇到过类似的情况。我已经为这个问题困扰了很长时间,情况越来越糟(更多的用户 - 它打破得更快),我将不胜感激任何建议。我为谷歌翻译道歉。

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

jvisualvm

下面是代码不起作用时的 jvisualvm 线程

jvisualvm 线程

jvisualvm 线程

jvisualvm 线程

在一切中断前几秒钟线程转储

代码不起作用时的线程转储

4

3 回答 3

1

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

于 2018-04-08T01:34:02.167 回答
1

解决方案是将 RestTemplate 声明从全局移动到本地。除了在 RestTemplate 中添加了“application/json”值外,“text/plain”和“ / ”也被自动添加了。在我收集 API 访问方法的班级中,每次使用 RestTemplate 都会导致添加此信息,结果是标头增长,直到我收到“请求标头或 Cookie 太大”。

多注意这一点是对的,但症状很奇怪,让我感到困惑。现在我明白了所有项目同时出现故障只是一个巧合,因为对其他服务器的调用数量大致相同。并且重新加载 tomcat 有帮助,因为标题在开始时是干净的。现在每个方法都会创建自己的 RestTemplate 实例,并且不会在标头中累积这些添加的信息。

感谢所有在聊天中帮助我并帮助我做出决定的人。我还想指出这个问题(及其答案)在我的情况下非常有用 - Spring RestTemplate - 如何启用请求/响应的完整调试/日志记录?

于 2018-04-08T09:32:07.643 回答
0

合理地,它显示了与负载平衡相关的“连接配置”的所有迹象。

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

序列化对象是 Java 类对象,“在加载到堆栈就绪后”然后将其移除到特殊包中以通过网络传输,类似于移除车辆的操作引擎并在其运行时将其移除并将其放置在另一辆空车中发动机舱在其运行时连接它。

RMI 被称为“远程方法调用”,这意味着有一个非常慎重的操作,即使用预加载的运行 Java 类从另一台机器上运行的 JVM 通过网络处理另一个远程机器上的实时运行 JVM 到另一个实时 JVM! ?

于 2018-04-08T08:11:09.713 回答