AWS-EKS 環境で Spring エンドポイントにアクセスしようとしています。この問題はローカルで再現していませんが、実稼働ログには、ロット 500 内部サーバー エラーと、同時に以下の EOF 例外が記録されています。
ログタイプ: tomcat-server メッセージ: コンテキスト [/something] のサーブレット [com.abc.platform.xservices.rest.abcApplication] の Servlet.service() が例外 [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
更新 一方、応答メッセージではなく実際の例外である場合は、単なるバグである可能性があります。昔のJavaと同じように 回避策としては、getResponseCode() を try/catch 内に配置し、例外が発生したときに 2 回目に呼び出すという方法があります。
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
}
}
接続数制限により通話中、読み取ります。