SpringのRestit Tempalteクライアントが実現
RetsTemplateはsrpingパッケージのhttpクライアントであり、httpサービスとの通信方式を簡略化し、RESTfulの標準を統一している。
実装
実装タイプ
接続池
タイムアウト設定
デフォルト(HttpURLConnection)
N
Y
Appche Http Components
Y
Y
Netty
N
Y
OkHttp
Y
Y
HttpURLConnectionパラメータ
設定
説明
conn.setConnect Timeout(1000)
接続のタイムアウト時間をミリ秒単位で設定します。接続タイムアウトとは、TCP接続による握手が成功した時間を指します。http握手と接続を参照してください。
conn.set ReadTimeout(1000)
読み出しタイムアウト時間をミリ秒単位で設定します。サーバから一度にデータを読み込む時間です。httpを参考してタイムアウトしました
setsUseCaches(bollan)
キャッシュを使うかどうか
set DoOutput(boot)
パラメータを入力するかどうか
set DoInput(bolean)
パラメータを読み込むかどうか
注意:HttpURLConnectionにはデータ接続プールの機能がありません。各要求ごとに接続を確立します。
Rets Templateがタイムアウトを実現しました。 HttpURLConnectionに基づいてタイムアウトを実現しました。 Apacheクライアントによるタイムアウトを実現する nettyタイムアウト を実現しました。
キティ依存を導入: Khttpクライアントタイムアウト Khttp 3クライアント依存を導入する
実装
実装タイプ
接続池
タイムアウト設定
デフォルト(HttpURLConnection)
N
Y
Appche Http Components
Y
Y
Netty
N
Y
OkHttp
Y
Y
HttpURLConnectionパラメータ
設定
説明
conn.setConnect Timeout(1000)
接続のタイムアウト時間をミリ秒単位で設定します。接続タイムアウトとは、TCP接続による握手が成功した時間を指します。http握手と接続を参照してください。
conn.set ReadTimeout(1000)
読み出しタイムアウト時間をミリ秒単位で設定します。サーバから一度にデータを読み込む時間です。httpを参考してタイムアウトしました
setsUseCaches(bollan)
キャッシュを使うかどうか
set DoOutput(boot)
パラメータを入力するかどうか
set DoInput(bolean)
パラメータを読み込むかどうか
注意:HttpURLConnectionにはデータ接続プールの機能がありません。各要求ごとに接続を確立します。
Rets Templateがタイムアウトを実現しました。
@Bean
public RestTemplate getRestTemplate(){
//default
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setReadTimeout(15000);//
requestFactory.setConnectTimeout(5000);//
RestTemplate restTemplate = new RestTemplate(requestFactory);
return restTemplate;
}
@Bean
public RestTemplate getRestTemplate(){
//apache
return new RestTemplate(getHttpCommonFactory());
}
@Bean
public ClientHttpRequestFactory getHttpCommonFactory(){
return new HttpComponentsClientHttpRequestFactory(httpClient());
}
@Bean
public HttpClient httpClient() {
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSocketFactory())
.build();
//
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
//#
connectionManager.setMaxTotal(200);
//#
connectionManager.setDefaultMaxPerRoute(20);
//connectionManager.setValidateAfterInactivity(httpPoolProperties.getValidateAfterInactivity());
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(15000) // (response) , read timeout
.setConnectTimeout(1000) // ( ) , connect timeout
// , , org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
.setConnectionRequestTimeout(30000)
.build();
return HttpClientBuilder.create()
.setDefaultRequestConfig(requestConfig)
.setConnectionManager(connectionManager)
.build();
}
キティ依存を導入:
<dependency>
<groupId>io.nettygroupId>
<artifactId>netty-allartifactId>
<version>4.1.36.Finalversion>
dependency>
初期化Rest Template@Bean
public RestTemplate getRestTemplate(){
//netty
Netty4ClientHttpRequestFactory nettyFactory = new Netty4ClientHttpRequestFactory();
nettyFactory.setReadTimeout(15000);
nettyFactory.setConnectTimeout(5000);
return new RestTemplate((ClientHttpRequestFactory)nettyFactory);
}
注意:nettyはNIOの実現フレームであり、接続数はオペレーティングシステムの制限を受け、クライアントのタイムアウトを処理する時、サービスエンドの処理接続数と合併(非nettyサービスエンド設定)に注意する。 <dependency>
<groupId>com.squareup.okhttp3groupId>
<artifactId>okhttpartifactId>
<version>3.14.1version>
dependency>
ok http 3を使ってRestTemplateを初期化します。@Bean
public RestTemplate getRestTemplate(){
//okhttp
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(15000,TimeUnit.MILLISECONDS)
.connectTimeout(Duration.ofMillis(5000))
.connectionPool(new ConnectionPool())
.retryOnConnectionFailure(false)
.build();
OkHttp3ClientHttpRequestFactory okhttpFactory=new OkHttp3ClientHttpRequestFactory(client);
return new RestTemplate((ClientHttpRequestFactory)okhttpFactory);
}
ここの接続池はConnection Pool、maxPool=2147483647です。static{exector=new ThreadPool Exector(0,2147483647,60 L,TimeUnit.SECONDS,new SyncronousQue(),Util.threadFactory(「OkHttp Connection Pool」,true);