HTTP 失败:java.net.SocketException:套接字关闭;不启动异常处理方法



我有一个rxjava链请求,该请求应该发布一些锁定oneror()或oncomplete(),所以,基本上,我的问题是:当我将读取,连接和写入超时我的okhttpclient,我没有得到所需的行为。我正在使用RetRofit2和Okhttp3.6.0这是我的简化客户端:

OkHttpClient.Builder builder = new OkHttpClient.Builder()
           .readTimeout(30, TimeUnit.SECONDS)
           .connectTimeout(30, TimeUnit.SECONDS)
           .writeTimeout(30, TimeUnit.SECONDS)
OkHttpClient okHttpClient = builder.build();

这是我拥有的链请求的简化版本:

public <T extends Response> Observable<T> doSomething(Observable<T> base) {
    isLocked = true;
    return someApiCall()
               .flatMap(apiResponse -> handleResponse(apiResponse, base)
                   .doOnError(throwable -> {
                       isLocked = false;
                   })
                   .doOnCompleted(() -> {
                       isLocked = false;
                   }));
}

handleResponse()进行另一个API调用并返回Observable<Response<Something>>,但是,正如我所说,它有时会因HTTP FAILED: java.net.SocketException: Socket closed而失败,并且永远不会完成可观察到的,因此,OnError()或OnComplete()或OnComplete()从未被调用。我也尝试过Onterminate(),但没有运气。当我从OkHttlClient中删除超时设置时,SocketException实际上被抛出并捕获,以释放isLocked变量。我尝试用handleResponse()块将CC_7返回语句包装,但即使设置自定义超时时,也不会捕获SocketException。有什么想法吗?

i在Android中解决了这种情况,并使用构建器设置了retryonConnectionFailure(true)。

鉴于Raturofit 2仅接收OKHTTPCLIENT对象。

在Retrofit 2中,HTTP层以下/上方的例外不是Response<?>,而是通过onError进行的实际例外。

在您的情况下,您应该将doOnError/doOnCompleted移出flatMap;就像现在一样,他们仅响应handleResponse中生成的错误 - 但是如果someApiCall返回可观察到的错误,则该方法不会调用。

事实证明,该请求已取消订阅,这导致了HTTP FAILED: java.net.SocketException: Socket closed错误的外观,因此,解决方案只是将此代码添加到链条:

.doOnUnsubscribe(() -> {
    isLocked = false;
})

我仍然不明白为什么自定义超时值触发了SocketException,但是我想插座正在等待超时到期,关闭或完成请求并关闭,但是它被unsubscribe打断了因此意外关闭。

最新更新