OkHttpClientの接続失敗時の再試行オプションを設定しています。OkHttpClientに最大再試行回数があります
client = new OkHttpClient();
client.setRetryOnConnectionFailure(true);
私は何度も試してみたいと思います。 source codeを見ると、私には最大限の制限はありませんでした。数回試行した後でクライアントの試行を停止するようにクライアントを設定するにはどうすればよいですか?
OkHttpClientの接続失敗時の再試行オプションを設定しています。OkHttpClientに最大再試行回数があります
client = new OkHttpClient();
client.setRetryOnConnectionFailure(true);
私は何度も試してみたいと思います。 source codeを見ると、私には最大限の制限はありませんでした。数回試行した後でクライアントの試行を停止するようにクライアントを設定するにはどうすればよいですか?
より多くのドキュメントは、接続の問題が発生した ときに再試行するか、しないように、このクライアントを構成し、ここでhttps://square.github.io/okhttp/3.x/okhttp/okhttp3/OkHttpClient.Builder.html#retryOnConnectionFailure-boolean-
があります。
- 到達不能IPアドレス:デフォルトでは、このクライアントは黙っ 次のような問題から回復します。 URLのホストに複数のIPアドレスがある場合、個々のIPアドレスに到達できない場合でも、全体の要求は失敗しません。これにより、マルチホームサービスの可用性が向上します。
古くプールされた接続。 ConnectionPoolはソケットを再利用して要求の待ち時間を減らしますが、これらの接続は時折タイムアウトします。
到達不能なプロキシサーバー。 ProxySelectorを使用すると、複数のプロキシサーバーを順番に試行することができ、最終的に直接接続に戻ることができます。
この要求をfalseに設定すると、要求を再試行すると破壊的な状態になるのを防ぐことができます。この場合、呼び出し元のアプリケーションは接続障害の回復を自身で行う必要があります。
しかし、一般的には、古い接続が存在する場合や再試行可能な代替パスがある場合は、再試行することを意図しています。同じことを無限に再試行しないでください。
またConnectionSpecSelector.connectionFailed
最大限を設定する方法はありませんが、以下のようなインターセプタを追加できます。
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
// try the request
Response response = chain.proceed(request);
int tryCount = 0;
int maxLimit = 3; //Set your max limit here
while (!response.isSuccessful() && tryCount < maxLimit) {
Log.d("intercept", "Request failed - " + tryCount);
tryCount++;
// retry the request
response = chain.proceed(request);
}
// otherwise just pass the original response on
return response;
}
});
インターセプトの詳細はhereです。
参照Iを以下の回避策を行った:HTTPステータスコードの
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
// try the request
Response response = doRequest(chain,request);
int tryCount = 0;
while (response == null && tryCount <= RetryCount) {
String url = request.url().toString();
url = switchServer(url);
Request newRequest = request.newBuilder().url(url).build();
tryCount++;
// retry the request
response = doRequest(chain,newRequest);
}
if(response == null){//important ,should throw an exception here
throw new IOException();
}
return response;
}
private Response doRequest(Chain chain,Request request){
Response response = null;
try{
response = chain.proceed(request);
}catch (Exception e){
}
return response;
}
これは完全に私のために働いています。どうもありがとう。 – yoavgray
これも私の理解です。また、失敗したSSLハンドシェイクも再試行します。しかし、それは完全にTCP接続の失敗を再試行するようではありません。 – RajV