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プログラムで例外が発生する。