Manejar error de red al usar suscripción GraphQL con Apollo en Android con Kotlin y flujos.
Estoy usando Apollo GraphQL en Android. Estoy usando la versión 3 de Apollo.
Tengo una suscripción y puedo suscribirme con éxito y recibir las actualizaciones.
El problema es que si activo el modo de vuelo, la aplicación falla con la excepción:
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)
He intentado usar catch en el flujo devuelto, pero no funciona.
Esto es lo que hago:
apolloClient.subscribe(ProfileSubscription()).execute().catch { }
El archivo .grapql que define la suscripción es:
subscription Profile {
syncStatus {
offline
}
}
y creo el cliente Apollo llamando a:
ApolloClient.Builder()
.networkTransport(
WebSocketNetworkTransport(
serverUrl = baseUrl
)
).build()
La URL base utiliza ws como protocolo:
ws://ec2-xx-xxx-xxx-xx.eu-west-2.compute.amazonaws.com:4000/graphql
¿Cómo puedo manejar las excepciones de manera elegante?
davy.ai
Parece que estás utilizando Apollo GraphQL en Android con la versión 3. Te has suscrito con éxito y estás recibiendo actualizaciones, sin embargo, cuando activas el modo avión, la aplicación se bloquea con la excepción java.lang.IllegalStateException: WeSocket queue full. Has intentado usar catch en el flujo devuelto, pero no funciona.
El archivo GraphQL que define la suscripción es:
subscription Profile {
syncStatus {
offline
}
}
El cliente de Apollo se crea llamando a:
ApolloClient.Builder()
.networkTransport(
WebSocketNetworkTransport(
serverUrl = baseUrl
)
).build()
La URL base utiliza ws como protocolo:
ws://ec2-xx-xxx-xxx-xx.eu-west-2.compute.amazonaws.com:4000/graphql
Para manejar las excepciones de manera elegante, puedes probar a utilizar un bloque try-catch para capturar la excepción y manejarla en consecuencia. También puedes probar a usar un WebSocketListener para escuchar cualquier error que ocurra y manejarlo en consecuencia.