我正在努力让项目更稳定。问题是,在某些情况下,所有使用与其他API通信的代码都会停止工作。直到我重新启动tomcat,我每隔几个小时就要做的事情(从4小时到几分钟,似乎取决于用户数量)。同时,接受GET(或任何其他)请求但在其活动期间不与其他服务器联系的代码 - 它继续工作。与其他服务器的通信丢失,此服务器上的其他项目也将丢失。
服务器Ubuntu 12.04,nginx 1.12.0,tomcat 9.0.0.M26。 服务器在java上有12个小项目。 Spring 5.0.4.RELEASE,hibernate 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线程
答案 0 :(得分:1)
尝试升级到Tomcat 9.0.6。在9.0.0和9.0.6之间修复了几个错误。
答案 1 :(得分:1)
解决方案是将RestTemplate声明从全局移动到本地。除了RestTemplate中添加的“application / json”值之外,还自动添加了“text / plain”和“ / ”。 在我的类中,收集API访问方法,每次使用RestTemplate导致添加此信息,结果是标题增长,直到我收到“请求标题或Cookie过大”。
对此更加注意是正确的,但症状很奇怪,让我很困惑。 现在我明白,所有项目的同时故障只是巧合,因为对其他服务器的呼叫数量大致相等。 并重新加载tomcat有帮助,因为标头在开始时是干净的。 现在每个方法都创建自己的RestTemplate实例,并且不会在标题中累积这些添加的信息。
感谢所有帮助我聊天的人,并帮助我做出决定。 我还要注意这个问题(及其答案)在我的情况下非常有用 - Spring RestTemplate - how to enable full debugging/logging of requests/responses?
答案 2 :(得分:0)
合理地显示了"连接配置的所有迹象"关于负载平衡。
正如您所说,当它获得大量用户时就会这样做。 但是,似乎在某些网络请求中使用了某种类型的seralized RMI对象
序列化对象是java类对象,它们在加载到堆栈后就已准备就绪了#34;然后被移到一个特殊的包装中,通过网络传输,类似于移除车辆的操作引擎并在其运行时将其移除,并将其放置在另一辆带有空发动机舱的车辆中,以便在其运行时将其连接。
RMI被称为"远程方法调用",这意味着使用从另一台机器上运行的JVM预加载的运行java类,在另一台远程机器上处理实时操作JVM的非常谨慎的操作通过网络进入另一个实时JVM!?