Tomcat 8.5.29 抛出 EOFException 并出现 500 内部服务器错误

Tomcat 8.5.29 抛出 EOFException 并出现 500 内部服务器错误

我正在尝试访问 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

这可能是由错误请求引起的,但也可能是由服务器代码或过载引起的。如果您有权访问服务器,请检查事件日志。

也可以看看

500 EOF(当需要块头时)

为什么 LWP::UserAgent 可能会因‘500 EOF’而失败?

perl 脚本中,500 EOF 代替响应状态行

Apache 1.3 错误 - 读取 HTTP 状态时出现意外的 EOF - connectionreset

错误 500!

更新另一方面,如果它不是响应消息,而是一个真正的异常,那么它可能只是一个错误,就像在旧 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
        }
    }

按连接数限制进行交谈、阅读。

相关内容