リクエストを作成し、そのリクエストが4xx
エラーを返した場合Retrofit/Okhttpはリクエストを再試行し続けます。 retryOnConnectionFailure
をfalseに設定し、15秒のタイムアウトを設定しましたが、すべて無視されるようです。私は何か見落としてますか?Okhttpは常に失敗した接続を再試行します
private static OkHttpClient getClient() {
return new OkHttpClient.Builder()
.addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(BuildConfig.DEBUG ? HttpLoggingInterceptor.Level.BODY : HttpLoggingInterceptor.Level.NONE))
.readTimeout(15, TimeUnit.SECONDS)
.connectTimeout(15, TimeUnit.SECONDS)
.retryOnConnectionFailure(false)
.addInterceptor(chain -> {
Request request = chain.request()
.newBuilder()
.build();
return chain.proceed(request);
}).build();
}
public static Retrofit getRetrofitClient(Gson gson){
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(baseUrl)
.client(OkHttpLogger.getClient());
if(gson != null){
builder.addConverterFactory(GsonConverterFactory.create(gson));
}else{
builder.addConverterFactory(GsonConverterFactory.create());
}
return builder.build();
}
私は私が見てい
ことの一つは、私は5秒のタイムアウトを設定した場合、それは5秒間の再試行を続けて完璧に動作していることである編集改造2.3.0
とokhttpバージョン3.8.1
を使用していますそれから私に失敗を与えるが、もし私が10秒にそれをバンプすれば、それはちょうど行くことを続け、最終的に2分ほどで止まる。
依頼を続行するのはあなたの傍受者ですか?サイレントリクエストの再試行を無効にするための既知のスイッチとして 'retryOnConnectionFailure(false)'を実装するのは正しいです。 –
@ M.Palsichはインターセプタを削除しても効果がありません。私が見ていることの1つは、5秒のタイムアウトを設定すると完全に動作して5秒間リトライしてから失敗しますが、10秒間バンプすれば2分ほどで終了します。 – tyczj
TCP SYN再試行のための独自の設定を持つ環境内に存在するエミュレータでテストしていますか?たとえば、Linuxは独自のTCP SYN再試行制限を設定できます。 –