12

私は 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% 信頼できるほど十分なテストを行っていません。

この前の質問では、特にこれらの例外が見られ、それらを無視するようにというアドバイスがありますが、これはおかしなことのように思えます: サーバーからデータを読み取っているときに例外が発生するため、データ処理コード (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...)
4

3 に答える 3

2

CANCEL エラー コードが割り当てられている 2 つの場所SpdyStream#closeInternal(246 行目) とSpdyStream#receiveRstStream(304 行目) にブレークポイントを設定することをお勧めします。ここにブレークポイントを設定できれば、誰がストリームをキャンセルしているかを把握でき問題が明らかになります。

何らかの理由でデバッガーをアタッチできない場合は、それらの行に到達したときにスタック トレースを出力するようにコードをインストルメント化できます。

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

どちらの場合も、私はそのコードの作成者であり、この問題の解決をお手伝いしたいと思っています.

于 2014-06-13T04:46:53.147 に答える