1. ホーム
  2. java

SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした

2022-02-08 06:13:44

問題発生環境:ssm+mysql+gridFS+tomcat

問題のコードスニペット

public void write(OutputStream os, InputStream is) {
		try (BufferedOutputStream bos = new BufferedOutputStream(os); BufferedInputStream bis = new BufferedInputStream(is)) {
			int count;
			byte[] buffer = new byte[1024];
			while ((count = bis.read(buffer)) > 0) {
				bos.write(buffer, 0, count);
			}
			os.flush();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

ここで、出力ストリームはresponse.getOutPutStream()を使用しています。

問題:mongodbはプロジェクトとは別のサーバーに配備されているため、大きなファイルの読み込みにtomcatの制限である1接続の生存時間よりも長くかかり、tomcatが接続がタイムアウトしたと判断してしまう。

解決方法 tomcat の server.xml を修正し、以下のように設定します。

<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000" disableUploadTimeout="false"
               redirectPort="8443" />

disableUploadTimeout="false" を追加して、読み取り/書き込みの接続タイムアウトの設定を削除します。

または

<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
				keepAliveTimeout="100000"
               redirectPort="8443" />

keepAliveTimeout="100000"を増やして、接続の生存時間を長くする。