【问题标题】:How do I disconnect a OkHttp3 sse connection?如何断开 OkHttp3 sse 连接?
【发布时间】:2019-10-16 20:35:13
【问题描述】:

问题:

我正在尝试创建一个客户端,它可以使用 SSE(服务器发送的事件)从服务器接收事件,并且我正在使用 OkHttp3 来做到这一点,并结合 Ok​​Http3-sse 库(com.squareup.okhttp3: okhttp:4.1.0 & com.squareup.okhttp3:okhttp-sse:4.1.0)。 我能够连接到服务器并接收事件就好了,但是在某个时间点,我想断开客户端并关闭我的应用程序。那是问题所在。连接已关闭,但应用程序并未关闭,可能是由于 ConnectionPool 未关闭。

已尝试:

由于几乎没有任何关于使用 OkHttp3-sse 库的文档,因此我尝试从代码中进行逆向工程。我尝试过:

  • 调用RealEventSource.cancel(),它正在断开连接,但挂在线程上
  • 调用OkHttpClient.dispatcher().cancelAll(),它也在断开连接,但仍然挂在线程上
  • 调用Response.close(),它被传递给EventSourceListener.onOpen()

发现:

作为替代方案,我查看了https://github.com/heremaps/oksse,它的RealServerSentEvent.close() 调用符合我的预期。它关闭连接并停止所有线程,使应用程序完全关闭。 我查看了RealServerSentEvent 类的实现,以了解该实现与RealEventSource 有何不同。我认为区别在于读取循环的条件:

RealEventSource 线https://github.com/square/okhttp/blob/master/okhttp-sse/src/main/java/okhttp3/internal/sse/RealEventSource.kt#L75:

      try {
        listener.onOpen(this, response)
        while (reader.processNextEvent()) {
        }
      } catch (e: Exception) {
        listener.onFailure(this, e, response)
        return
      }

比较 RealServerSentEvent线https://github.com/heremaps/oksse/blob/master/src/main/java/com/here/oksse/RealServerSentEvent.java#L94

            listener.onOpen(this, response);

            //noinspection StatementWithEmptyBody
            while (call != null && !call.isCanceled() && sseReader.read()) {
            }

OkSSE 实现在循环中包含call.isCanceled() 的条件,而OkHttp3-sse 不包含。我怀疑这会导致OkHttp3-sse 无法退出,但我可能弄错了。

或者,我是否正在监督预期的断开连接方式?

【问题讨论】:

    标签: okhttp


    【解决方案1】:

    您正在正确使用 API,并且 OkHttp 应该会在调用被取消时导致读取失败并出现 IOException。显然这不会发生,我将其视为 OkHttp 中的错误。

    后续步骤:向 OkHttp 报告错误。如果你能用一个可执行的测试用例来做到这一点,我会确保这个问题很快得到修复。

    【讨论】:

    • 嗯,确实发生了 IOException 并且事件接收已停止,但线程似乎仍然存在。 OkSSE 实现甚至不抛出异常,而是优雅地停止并让应用程序退出。我会尽快报告错误。感谢您的快速回复!
    【解决方案2】:

    最终我发现可以通过调用优雅地关闭连接:

    eventSource.cancel();
    client.dispatcher().executorService().shutdown();
    

    由于这不需要对库进行任何更改,因此我关闭了错误报告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-07
      • 2012-07-15
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      相关资源
      最近更新 更多