gpt4 book ai didi

java - 是什么导致 okhttp 和 spdy 出现 "java.io.IOException: stream was reset: CANCEL"?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:41:56 30 4
gpt4 key购买 nike

我正在尝试使用 OKHttp(版本 2.0.0-RC2)和 SPDY 并看到 IOException: stream was reset: CANCEL 相当多,在一些初步的请求中可能占所有请求的 10% 或更多测试。据我所知,在使用 Apache HttpClient 和常规 https 时,我们没有看到任何等效问题。我很确定当 SPDY 被禁用时我们也没有看到任何与 OkHttp 等效的东西 (client.setProtocols(ImmutableList.of(Protocol.HTTP_1_1))) 但我没有做足够的测试来100% 自信。

This previous question看到这些异常以及忽略它们的建议,但这似乎很疯狂:我们在从服务器读取数据时遇到异常,因此我们中止了数据处理代码(使用 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...)

最佳答案

最好的办法是在分配 CANCEL 错误代码的两个地方设置断点:即 SpdyStream#closeInternal(第 246 行)和 SpdyStream#receiveRstStream(第 304 行)。如果您可以在此处放置一个断点,您可以捕获正在取消您的流,这将阐明问题。

如果出于某种原因您无法附加调试器,您可以检测代码以在到达这些行时打印堆栈跟踪:

new Exception("SETTING ERROR CODE TO " + errorCode).printStackTrace();

无论哪种情况,我都是该代码的作者,我很乐意帮助您解决这个问题。

关于java - 是什么导致 okhttp 和 spdy 出现 "java.io.IOException: stream was reset: CANCEL"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24190507/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com