我正在尝试访问 AWS-EKS 环境中的 spring 端点,我没有在本地重新创建此问题,但在生产日志中我们看到大量 500 内部服务器错误,同时记录了以下 EOF 异常:
日志类型:tomcat-server 消息:servlet.service() 用于 servlet [com.abc.platform.xservices.rest.abcApplication] 在路径 [/something] 上下文中抛出异常 [org.glassfish.jersey.server.ContainerException:java.io.EOFException:套接字上意外读取 EOF] 根本原因 java.io.EOFException:套接字上意外读取 EOF 在 org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:722) 在 org.apache.coyote.http11.Http11InputBuffer.access$300(Http11InputBuffer.java:40) 在 org.apache.coyote.http11.Http11InputBuffer$SocketInputBuffer.doRead(Http11InputBuffer.java:1072)
你知道为什么我们在生产中会看到这个问题吗?谢谢。
答案1
这是一个内部服务器错误,返回响应中的状态代码为 500
这可能是由错误请求引起的,但也可能是由服务器代码或过载引起的。如果您有权访问服务器,请检查事件日志。
也可以看看
为什么 LWP::UserAgent 可能会因‘500 EOF’而失败?
Apache 1.3 错误 - 读取 HTTP 状态时出现意外的 EOF - connectionreset
更新另一方面,如果它不是响应消息,而是一个真正的异常,那么它可能只是一个错误,就像在旧 Java 中一样 解决方法可能是将 getResponseCode() 放在 try/catch 中,并在发生异常时第二次调用:
int responseCode = -1;
try {
responseCode = con.getResponseCode();
} catch (IOException ex1) {
//check if it's eof, if yes retrieve code again
if (-1 != ex1.getMessage().indexOf("EOF")) {
try {
responseCode = con.getResponseCode();
} catch (IOException ex2) {
System.out.println(ex2.getMessage());
// handle exception
}
} else {
System.out.println(ex1.getMessage());
// handle exception
}
}
按连接数限制进行交谈、阅读。