La mayoría de las APIs de middleware devuelven un objeto SdvResult. Si la operación se realiza correctamente, este objeto contiene el objeto de resultado esperado. En caso de error, este objeto contiene un objeto SdvStatus, que indica un comportamiento inesperado o una condición de error, a menudo identificado por un código de error, como Internal, Unavailable o DataLoss.
En esta página, encontrarás ayuda para solucionar problemas relacionados con estos códigos de error.
Soluciona problemas de registro y errores de creación
Por lo general, los errores de registro y creación surgen cuando intentas crear o registrar un servicio no válido.
No se puede crear el segundo servicio
Error:
Error Internal.
Causa:
Estás intentando registrar dos veces la misma instancia del paquete de servicio (nombre y ID de instancia).
Solución:
No intentes registrar dos veces la misma instancia del paquete de servicios (nombre y ID de instancia).
No se puede borrar el paquete de servicios duplicado
Error:
Status(-3, EX_ILLEGAL_ARGUMENT)
Causa:
Estás intentando borrar un paquete de servicios duplicado que no existe.
Solución:
No intentes borrar un paquete de servicios duplicado que no existe.
No se puede recuperar una instancia del publicador para enviar mensajes
Error:
La llamada a take_publisher() devuelve none.
Causa:
Llamaste a take_publisher() dos veces para la misma variante desde la misma instancia del paquete de servicios.
Solución:
No llames a take_publisher() dos veces para la misma variante desde la misma instancia del paquete de servicios.
No se pueden crear objetos Subscriber, Observer, History ni InstantReader
Error:
Error Unavailable.
Causa:
Intentaste crear un Subscriber, Observer, History o InstantReader para un publicador que no existe o que se dio de baja.
Solución:
Verifica que el publicador exista o esté registrado antes de intentar crear un objeto Subscriber, Observer, History o InstantReader para el publicador.
No se puede crear el cliente de RPC
Error:
Unavailable error
Causa:
Intentaste crear un cliente de RPC para un nombre de unidad de servidor que no existe o no está registrado.
Solución:
Verifica que el servidor exista y esté registrado antes de crear el cliente de RPC.
Soluciona problemas de fallas de comunicación
Las fallas de comunicación pueden ocurrir después de que se ejecuta un servicio y comienza a comunicarse con otros servicios.
Soluciona problemas relacionados con la cancelación del registro de publicadores
Pueden producirse errores cuando un publicador anula su registro mientras sus lectores siguen activos.
La función read_next_messages() del suscriptor devuelve listas vacías
Error:
read_next_messages() se ejecuta correctamente, pero devuelve listas vacías.
Causa:
El editor se da de baja mientras sus lectores están activos.
Solución:
Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad no está disponible, se anula el registro del editor y no hay mensajes nuevos.
El método next() del observador devuelve un error interno
Error:
next() devuelve un error Internal.
Causa:
El editor se da de baja mientras sus lectores están activos.
Solución:
Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad no está disponible, significa que el editor ya no está y no hay mensajes nuevos.
El método read_from_history() del historial no devuelve mensajes nuevos
Error:
read_from_history() no devuelve mensajes nuevos, solo mensajes anteriores.
Causa:
El editor se da de baja mientras sus lectores están activos.
Solución:
Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad no está disponible, significa que el editor ya no está y no hay mensajes nuevos.
InstantReader read_latest_message() devuelve un error interno
Error:
read_latest_message() devuelve un error Internal.
Causa:
El editor se da de baja mientras sus lectores están activos.
Solución:
Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad no está disponible, significa que el editor ya no está y no hay mensajes nuevos.
Soluciona problemas relacionados con la cola de mensajes vacía
Pueden producirse errores cuando se intenta leer desde una cola de mensajes vacía.
La función read_next_messages() del suscriptor devuelve una lista vacía
Error:
read_next_messages() devuelve una lista vacía correctamente.
Causa:
El publicador está activo, pero no envió mensajes.
Solución:
Usa un suscriptor o un historial con una transmisión de disponibilidad. Si está disponible el último mensaje de la transmisión de disponibilidad, significa que el publicador está activo y no hay mensajes nuevos.
El método next() del observador devuelve un error interno
Error:
next() devuelve un error Internal.
Causa:
El publicador está activo, pero no envió mensajes.
Solución:
Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad está disponible, significa que el editor está activo y no hay mensajes nuevos.
El método read_from_history() del historial no devuelve mensajes nuevos
Error:
read_from_history() devuelve una lista vacía correctamente.
Causa:
El publicador está activo, pero no envió mensajes.
Solución:
Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad está disponible, significa que el editor está activo y no hay mensajes nuevos.
InstantReader read_latest_message() devuelve un error interno
Error:
read_latest_message() devuelve un error Internal.
Causa:
El publicador está activo, pero no envió mensajes.
Solución:
Usa un suscriptor o un historial con una transmisión de disponibilidad. Si el último mensaje de la transmisión de disponibilidad está disponible, significa que el editor está activo y no hay mensajes nuevos.
Soluciona problemas de desbordamiento de búfer o pérdida de datos
Pueden producirse errores cuando el publicador envía mensajes a una velocidad mayor de la que un lector puede consumirlos.
La primera lectura del suscriptor después de un desbordamiento devuelve un error de DataLoss
Error:
read_next_message() devuelve un error DataLoss.
Causa:
El publicador envía mensajes a una velocidad mayor de la que un lector puede consumirlos.
Solución:
El primer next() del observador después de un desbordamiento devuelve un error de DataLoss
Error:
next() devuelve un error DataLoss.
Causa:
El publicador envía mensajes a una velocidad mayor de la que un lector puede consumirlos.
Solución: Estas son las posibles soluciones:
El publicador publica a un ritmo más lento. Por ejemplo, puedes tener una variable con la marca de tiempo del mensaje más reciente. Si la hora actual es anterior a la hora de publicación más reciente más un delta, no publiques el mensaje. Con este mecanismo, se publica como máximo un mensaje por delta.
El consumidor usa un objeto
InstantReaden lugar de un observador. Un objetoInstantReadno devuelve errores de desbordamiento y siempre devuelve el último mensaje. Si el último mensaje es el único que te importa, puedes usar un objetoInstantReaden lugar de un observador.El consumidor implementa el muestreo. Si tu solución tiene un publicador (P1) que publica mensajes más rápido de lo que el observador (O1) puede leerlos, puedes crear un nuevo publicador (P2) y un observador (O2) para adaptarse a la diferencia en la velocidad de publicación y lectura.
Por ejemplo, supongamos que P1 publica un mensaje cada 10 ms, pero O1 solo puede leer un mensaje cada 100 ms y descarta los nueve mensajes restantes. Para resolver la discrepancia, crea una solución que siga estos pasos:
- P1 publica mensajes en O2.
- O2 lee un mensaje y descarta nueve.
- O2 envía el mensaje leído a P2.
- P2 envía el mensaje de lectura a O1.
- O1 lee un mensaje cada diez segundos.
En el siguiente ejemplo de código, se muestra cómo implementar esta situación de muestreo:
int discarded_message = 10; while (true) { message m = O2.read_message(); if discarded_message == 10 { discarded_message = 0; P2.publish(m); } else { discarded_message ++; } }
Las lecturas del historial están incompletas
Error:
El mensaje se pierde antes de que se cree la copia del historial. No hay notificación de error directa en la lectura.
Causa:
El publicador envía mensajes a una velocidad mayor de la que un lector puede consumirlos.
Solución:
InstantReader solo lee el último mensaje
Error:
El mensaje se pierde antes de que se cree la copia del historial. No hay notificación de error directa en la lectura.
Causa:
El publicador envía mensajes a una velocidad mayor de la que un lector puede consumirlos.
Solución:
N/A
El cliente de RPC llama a un método que no está disponible
Error:
La llamada de método falla con el error Unavailable.
Causa:
El SDV no conoce el nombre del servidor y devuelve Unavailable. El middleware devuelve este error si el descubrimiento de servicios no devuelve un nombre de servidor válido.
Solución:
Inicia un paquete de servicios que define un server para la interfaz determinada que el cliente desea usar.
La implementación del servidor devuelve un error de SdvStatus
Error:
La implementación del servidor devuelve un SdvResult que contiene un error de SdvStatus, como SdvStatusCode::NotFound. El error se propaga de vuelta al cliente que realiza la llamada.
Causa:
El SDV y el sistema de comunicación entre el cliente y el servidor funcionan según lo esperado, pero el cliente realizó una solicitud que activa un error en el servidor.
Solución:
Realiza una solicitud válida con el cliente o corrige el servidor para que responda correctamente a esas solicitudes.