GlassFishでjava.io.IOExceptionとなった時の対応方法


- 環境
    - Red Hat Enterprise Linux Server release 6.3 (Santiago)
    - java version "1.7.0_79"
    - GlassFish 4.1


# 事象 : GlassFishで大量データ処理中にjava.io.IOExceptionになった
```bash
[2020/05/21 17:41:07.805][656b5aef53f][][FATAL] - java.io.IOException: java.lang.InterruptedException
org.glassfish.grizzly.nio.transport.TCPNIOTransportFilter.handleRead(TCPNIOTransportFilter.java:92)
org.glassfish.grizzly.filterchain.TransportFilter.handleRead(TransportFilter.java:173)
org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284)
org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201)
org.glassfish.grizzly.filterchain.DefaultFilterChain.read(DefaultFilterChain.java:351)
org.glassfish.grizzly.filterchain.FilterChainContext.read(FilterChainContext.java:695)
org.glassfish.grizzly.http.io.InputBuffer.blockingRead(InputBuffer.java:1119)
org.glassfish.grizzly.http.server.io.ServerInputBuffer.blockingRead(ServerInputBuffer.java:95)
org.glassfish.grizzly.http.io.InputBuffer.fill(InputBuffer.java:1143)
org.glassfish.grizzly.http.io.InputBuffer.read(InputBuffer.java:353)
org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:267)
org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:270)
sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
java.io.InputStreamReader.read(InputStreamReader.java:184)
java.io.BufferedReader.fill(BufferedReader.java:154)
java.io.BufferedReader.readLine(BufferedReader.java:317)
java.io.BufferedReader.readLine(BufferedReader.java:382)
...省略...
```

# 原因 : アプリケーションの実行時間がタイムアウトしたから
アプリケーションの実行時間を設定する設定`configs.config.network-config.protocols.protocol.http.request-timeout-seconds`を指定していないことが問題だった。

> Glassfishのデフォルトのタイムアウトは15分です。
> これは様々な状況で発生する可能性があります。
> 例えば、リクエストがタイムアウト時間内に応答を返さない長時間実行アクションを起動した場合、サーバへのリクエストがHTTPS経由で行われ、HTTP (またはその逆)しかサポートしていない場合、HTTP接続プールで利用可能な接続がもうない場合などです。
> [java - GRIZZLY0023 Glassfish warning - Stack Overflow](https://stackoverflow.com/questions/22666847/grizzly0023-glassfish-warning)

## 対応 : domain.xmlのhttp.request-timeout-secondsの設定をする
今回は、設定していないためタイムアウトが15分になっていたので無制限の「-1」に設定した。

```xml:domain.xml
  <configs>
    <config name="server-config">
      <network-config>
        <protocols>
          <protocol name="http-listener-1">
            <http max-post-size-bytes="20971520" default-virtual-server="server" max-connections="250" request-timeout-seconds="-1">
```

GlassFish管理画面(http://localhost:4848)で設定する場合は、
`server-config` > `Network Config` > `Network Listeners` > {対象のListener} > [HTTP]タブ > `Request Timeout:`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/cf0eeb0c-1f71-2c01-72a9-1b0274338995.png)

Glassfish 3.1.2から「-1」は設定できないらしいが設定したら`java.io.IOException`が発生しなくなった・・・でも管理画面で見ると初期値の900秒(15分)になっている・・・不思議
> Unfortunately you can't set it to -1 to have no limit since Glassfish 3.1.2.
> [java - GRIZZLY0023 Glassfish warning - Stack Overflow](https://stackoverflow.com/questions/22666847/grizzly0023-glassfish-warning)

Payaraでもできるんだろうか？