我正在尝试使用OKHttp(版本2.0.0-RC2)和SPDY,看到IOException: stream was reset: CANCEL
相当多,可能是一些初步测试中所有请求的10%或更多。在使用Apache HttpClient和常规https时,就我所知,我们没有看到任何等效问题。我很确定当SPDY被禁用时(client.setProtocols(ImmutableList.of(Protocol.HTTP_1_1))
)我们也没有看到与OkHttp等效的东西,但我没有做足够的测试以100%自信。
This previous question看到了这些异常,其中的建议是忽略它们,但这看起来很疯狂:我们在从服务器读取数据时遇到异常,因此我们中止数据处理代码(使用Jackson) 。在这种情况下,我们需要做某事。当然,我们可以重试请求,但有时它是一个不能重试的POST请求,如果我们已经开始从服务器接收数据,那么服务器已经采取了所请求的操作,这是一个不错的选择。 / p>
理想情况下,我们可以做一些客户端和/或服务器配置,以减少这些异常的发生率,但我不太了解SPDY,甚至不知道从哪里开始寻找或建议我们服务器管理团队开始寻找。
堆栈跟踪,万一它有用:
java.io.IOException: stream was reset: CANCEL
at com.squareup.okhttp.internal.spdy.SpdyStream$SpdyDataSource.checkNotClosed(SpdyStream.java:442)
at com.squareup.okhttp.internal.spdy.SpdyStream$SpdyDataSource.read(SpdyStream.java:344)
at com.squareup.okhttp.internal.http.SpdyTransport$SpdySource.read(SpdyTransport.java:273)
at okio.RealBufferedSource.exhausted(RealBufferedSource.java:60)
at okio.InflaterSource.refill(InflaterSource.java:96)
at okio.InflaterSource.read(InflaterSource.java:62)
at okio.GzipSource.read(GzipSource.java:80)
at okio.RealBufferedSource$1.read(RealBufferedSource.java:227)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.loadMore(UTF8StreamJsonParser.java:174)
at com.fasterxml.jackson.core.base.ParserBase.loadMoreGuaranteed(ParserBase.java:431)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString2(UTF8StreamJsonParser.java:2111)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._finishString(UTF8StreamJsonParser.java:2092)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.getText(UTF8StreamJsonParser.java:275)
at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:205)
at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeArray(JsonNodeDeserializer.java:230)
at com.fasterxml.jackson.databind.deser.std.BaseNodeDeserializer.deserializeObject(JsonNodeDeserializer.java:202)
at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:58)
at com.fasterxml.jackson.databind.deser.std.JsonNodeDeserializer.deserialize(JsonNodeDeserializer.java:15)
at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:2765)
at com.fasterxml.jackson.databind.ObjectMapper.readTree(ObjectMapper.java:1546)
at com.fasterxml.jackson.core.JsonParser.readValueAsTree(JsonParser.java:1363)
at (application-level code...)
答案 0 :(得分:2)
最好的办法是在分配了CANCEL错误代码的两个地方设置一个断点:SpdyStream#closeInternal
(第246行)和SpdyStream#receiveRstStream
(第304行)。如果您可以在此处设置断点,则可以捕获谁取消您的信息流,并且可以解决问题。
如果由于某种原因无法附加调试器,您可以检测代码以在到达这些行时打印堆栈跟踪:
new Exception("SETTING ERROR CODE TO " + errorCode).printStackTrace();
在任何一种情况下,我都是该代码的作者,我很乐意帮助您解决此问题。
答案 1 :(得分:0)
由于http标头损坏,我们遇到了这个问题。默认情况下,Android Base64编码器会添加新行,这会破坏我们的授权标题。
答案 2 :(得分:-1)
有同样的问题,这是网络连接超时的结果,这是从Web服务下载大文件的结果 我将超时设置为2分钟,所以我将其更改为5分钟,这解决了我的问题
val okkHttpclient = OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.MINUTES)
.writeTimeout(5, TimeUnit.MINUTES) // write timeout
.readTimeout(5, TimeUnit.MINUTES) // read timeout
.addInterceptor(networkConnectionInterceptor)
.build()