一段时间后,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在代码不起作用的时候
尝试升级到 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?
我正在努力使项目更加稳定。问题是在某些时候会出现所有使用与其他 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在代码不起作用的时候
尝试升级到 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?