我正在尝试使用OKHttp(版本2.0.0-RC2)和SPDY进行实验,并经常遇到"IOException: stream was reset: CANCEL"的问题, 在一些初步测试中,可能有10%或更多的请求出现此问题。当使用Apache HttpClient和普通https时,据我所知,我们没有看到任何等效的问题。我相当确定在禁用SPDY时,也不会像OkHttp那样看到任何等效的问题(
在这个之前的问题中,这些异常是其中之一,并且建议忽略它们,但这似乎很疯狂:我们在从服务器读取数据时收到异常,因此我们中止处理数据的代码(使用Jackson)。在这种情况下,我们需要做一些事情。当然,我们可以重试请求,但有时它是不可重试的POST请求,如果我们已经开始从服务器接收数据,那么可以肯定服务器已经采取了请求的操作。
理想情况下,我们可以通过一些客户端和/或服务器的配置来减少这些异常的发生率,但我对SPDY的了解还不足以知道从哪里开始查找或建议我们的服务器管理员团队开始查找。
如果有帮助,以下是堆栈跟踪:
client.setProtocols(ImmutableList.of(Protocol.HTTP_1_1))
),但我还没有进行足够的测试以百分之百地确认。在这个之前的问题中,这些异常是其中之一,并且建议忽略它们,但这似乎很疯狂:我们在从服务器读取数据时收到异常,因此我们中止处理数据的代码(使用Jackson)。在这种情况下,我们需要做一些事情。当然,我们可以重试请求,但有时它是不可重试的POST请求,如果我们已经开始从服务器接收数据,那么可以肯定服务器已经采取了请求的操作。
理想情况下,我们可以通过一些客户端和/或服务器的配置来减少这些异常的发生率,但我对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...)