【问题标题】:okhttp3.internal.framed.StreamResetException: stream was reset: CANCELokhttp3.internal.framed.StreamResetException:流被重置:CANCEL
【发布时间】:2021-04-01 22:14:32
【问题描述】:

我通过 rest api 从 Azure KeyVault 获取秘密。在后端,我使用的是 azure-keyvault-client,它在后面使用改造和 okhttp3。我的应用程序已经运行良好很长时间了。现在它突然出现异常。每次发生异常时,我都会重新启动应用程序。然后异常消失了。一切看起来都很好。 “流被取消”的原因是什么?

下面是完整的堆栈跟踪。

我已尝试远程调试应用程序。我发现调用FramedStream.closeInternal()时抛出了异常。 HttpEngine 尝试关闭,但 source.finished = false 和 sink.finished = true。

【问题讨论】:

  • 我已经尝试阅读了okhttp的代码。但是我仍然无法弄清楚 ErrorCode CANCEL 将在哪种情况下分配给响应源流。

标签: okhttp


【解决方案1】:

它可以是本地取消流,也可以是来自服务器。您可以使用 HTTP/2 帧日志记录来查看它是否来自服务器。

https://square.github.io/okhttp/debug_logging/#http2-frame-logging

问题是否会持续到重新启动?如果是这样,服务器可能希望您或 OkHttp 在取消后关闭连接,但在这种情况下不会出现这种情况。所以最好调试框架,然后与服务器团队讨论。

https://github.com/square/okhttp/blob/master/okhttp-testing-support/src/main/kotlin/okhttp3/OkHttpDebugLogging.kt

  fun enableHttp2() = enable(Http2::class)

  fun enableTaskRunner() = enable(TaskRunner::class)

  fun enable(loggerClass: String) {
    val logger = Logger.getLogger(loggerClass)
    if (configuredLoggers.add(logger)) {
      logger.addHandler(ConsoleHandler().apply {
        level = Level.FINE
        formatter = object : SimpleFormatter() {
          override fun format(record: LogRecord) =
            String.format("[%1\$tF %1\$tT] %2\$s %n", record.millis, record.message)
        }
      })
      logger.level = Level.FINEST
    }
  }

【讨论】:

  • 我已尝试远程调试该应用程序。我发现调用 FramedStream.closeInternal() 时会抛出异常。 HttpEngine 尝试关闭但 source.finished = false 和 sink.finished = true
猜你喜欢
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-06-09
  • 2016-10-02
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多