使用带有 Kotlin 和流的 Android 上的 Apollo 订阅 GraphQL 时处理网络错误

Posted

技术标签:

【中文标题】使用带有 Kotlin 和流的 Android 上的 Apollo 订阅 GraphQL 时处理网络错误【英文标题】:Handle network error when using GraphQL subscription with Apollo on Android with Kotlin and flows 【发布时间】:2021-12-28 16:12:47 【问题描述】:

我在 android 上使用 Apollo GraphQL。我正在使用 Apollo 版本 3。 我有订阅,我可以成功订阅并获取更新。 问题是,如果我打开应用程序的飞行模式,则会出现异常:

    java.lang.IllegalStateException: WeSocket queue full
        at com.apollographql.apollo3.network.ws.DefaultWebSocketEngine$open$3.send(OkHttpWebSocketEngine.kt:90)
        at com.apollographql.apollo3.network.ws.WsProtocol.sendMessageMapBinary(WsProtocol.kt:92)
        at com.apollographql.apollo3.network.ws.SubscriptionWsProtocol.stopOperation(SubscriptionWsProtocol.kt:69)
        at com.apollographql.apollo3.network.ws.WebSocketNetworkTransport$3.invokeSuspend(WebSocketNetworkTransport.kt:144)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:920)

我尝试在返回的流上使用catch,但它不起作用。 我就是这样做的:

apolloClient.subscribe(ProfileSubscription()).execute().catch   

定义订阅的.grapql文件是:

subscription Profile 
    syncStatus 
        offline
    

我通过调用创建 Apollo 客户端:

ApolloClient.Builder()
        .networkTransport(
            WebSocketNetworkTransport(
                serverUrl = baseUrl
            )
        ).build()

基本 url 使用ws 作为协议:

ws://ec2-xx-xxx-xxx-xx.eu-west-2.compute.amazonaws.com:4000/graphql

如何优雅地处理异常?

【问题讨论】:

您使用的是哪个版本的 Apollo?我有一个类似的问题。我已经在github.com/apollographql/apollo-android/issues/3634 提交了错误报告我不确定我的代码是否正确,但我确信抛出 IllegalStateException 不是正确的响应。 这是阿波罗版本 3 是3.0.0-beta04还是更早的版本? 它是 beta03。我现在看到 beta05 可用。我会检查一下,虽然我不认为行为会改变 我想知道,因为我在 beta04 中遇到了这个问题,但一开始并没有注意到 beta03 的问题。我提交了一个错误报告 github.com/apollographql/apollo-android/issues/3634 并且 beta05 应该有一个修复。 【参考方案1】:

我刚刚处理了启动流程的异常:

viewModelScope.launch(CoroutineExceptionHandler _, _ -> ) 
    profilesUpdatesUseCase.subscribe()

方法profilesUpdatesUseCase.subscribe()是调用的方法:

apolloClient.subscribe(ProfileSubscription()).execute()

当然,ViewModel 最终需要在可能的情况下重新启动流程。

【讨论】:

以上是关于使用带有 Kotlin 和流的 Android 上的 Apollo 订阅 GraphQL 时处理网络错误的主要内容,如果未能解决你的问题,请参考以下文章

Kafka - 带有批处理数据和流的事件之间的区别

用于列表和流的 memq

使用 Laravel-Excel 和流的方法导出 Excel

MediaPlayer基础-生命周期状态分析

Flutter 中 StreamBuilder 和流的问题(接收重复数据)

java_io_FileOutStream和流的分类