HttpURLConnectionのタイムアウト(Java)

https://ku6.jp/report/52.html

connect timeout
connect timeoutは接続にかかった時間で、setConnectTimeoutで設定します。

read timeout
read timeoutはデータ取得にかかった時間で、setReadTimeoutで設定します。

read timeout の試験?

javaはよくわからないが、ネットでいろいろ調べてread timeoutの動作確認をするためのプログラムを作った。
(QuickStart.java)

//package org.apache.http.examples.client;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
//import java.nio.charset.StandCharsets;
import java.util.UUID;

public class QuickStart {

    public static void main(String[] args) throws Exception {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            URL url = new URL("http://localhost:4567");
            HttpURLConnection connection = (HttpURLConnection)url.openConnection();
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);
            connection.getContent();
        } catch (java.net.SocketTimeoutException e){
            System.err.println(e);
        } finally {
            httpclient.close();
        }
    }
}


https://hc.apache.org/downloads.cgi からhttpcomponents-client-4.5.13-bin.tar.gz(binary)をダウンロードし、展開する。

$ gzip -dc httpcomponents-client-4.5.13-bin.tar.gz | tar xvf -

コンパイルする。

$ javac -cp httpcomponents-client-4.5.13/lib/httpclient-4.5.13.jar:httpcomponents-client-4.5.13/lib/httpcore-4.4.13.jar QuickStart.java
$ ls
QuickStart.class  httpcomponents-client-4.5.13
QuickStart.java   httpcomponents-client-4.5.13-bin.tar.gz

 クラスパスの設定とかよくわからなかったが、なんとかコンパイルできた。

・実行方法

$ java -cp httpcomponents-client-4.5.13/lib/httpclient-4.5.13.jar:httpcomponents-client-4.5.13/lib/httpcore-4.4.13.jar:httpcomponents-client-4.5.13/lib/commons-logging-1.2.jar:. QuickStart

 成功にたどりつくまでに、いろいろエラーメッセージがでたが、どう対処したらいいのかよくわからない。
 クラスパスに、"httpcomponents-client-4.5.13/lib/commons-logging-1.2.jar"と"."を追加してやっと実行できた。

rubyをインストールする
sinatraをインストールする

$ gem install sinatra


・試験1(サーバの応答が1秒後の場合)

(timeout.rb)

#!/usr/bin/env ruby
require 'sinatra'

get '/' do
  sleep(1)
  'Hello!Sinatra!'
end
sinatraを実行
$ ruby timeout.rb
[2020-12-13 01:06:19] INFO  WEBrick 1.6.0
[2020-12-13 01:06:19] INFO  ruby 2.7.2 (2020-10-01) [x86_64-linux]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2020-12-13 01:06:19] INFO  WEBrick::HTTPServer#start: pid=5111 port=4567

javaプログラムを実行
$ java -cp httpcomponents-client-4.5.13/lib/httpclient-4.5.13.jar:httpcomponents-client-4.5.13/lib/httpcore-4.4.13.jar:httpcomponents-client-4.5.13/lib/commons-logging-1.2.jar:. QuickStart

↓sinatraの続き
127.0.0.1 - - [13/Dec/2020:01:06:32 +0900] "GET / HTTP/1.1" 200 14 1.0067
127.0.0.1 - - [13/Dec/2020:01:06:31 JST] "GET / HTTP/1.1" 200 14
- -> /

 javaプログラムは正常終了する。


・試験2(サーバの応答が6秒後の場合)

(timeout.rb)

#!/usr/bin/env ruby
require 'sinatra'

get '/' do
  sleep(6)
  'Hello!Sinatra!'
end
sinatraを実行
$ ruby timeout.rb
[2020-12-13 01:12:30] INFO  WEBrick 1.6.0
[2020-12-13 01:12:30] INFO  ruby 2.7.2 (2020-10-01) [x86_64-linux]
== Sinatra (v2.1.0) has taken the stage on 4567 for development with backup from WEBrick
[2020-12-13 01:12:30] INFO  WEBrick::HTTPServer#start: pid=5232 port=4567

javaプログラムを実行
$ java -cp httpcomponents-client-4.5.13/lib/httpclient-4.5.13.jar:httpcomponents-client-4.5.13/lib/httpcore-4.4.13.jar:httpcomponents-client-4.5.13/lib/commons-logging-1.2.jar:. QuickStart
java.net.SocketTimeoutException: Read timed out

↓sinatraの続き
127.0.0.1 - - [13/Dec/2020:01:13:12 +0900] "GET / HTTP/1.1" 200 14 6.0097
127.0.0.1 - - [13/Dec/2020:01:13:05 JST] "GET / HTTP/1.1" 200 0
- -> /

 javaプログラムで例外が発生する。