La mayoría de las APIs de middleware devuelven un objeto SdvResult. Si se ejecuta 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
identificada por un código de error, como Internal, Unavailable o DataLoss.
Esta página te ayuda a solucionar estos códigos de error.
Soluciona problemas de registro y creación
Por lo general, los errores de registro y creación se producen cuando intentas crear o registrar un servicio no válido.
No se puede crear el segundo servicio
Error:
Internal error.
Causa:
Estás intentando registrar exactamente la misma instancia del paquete de servicios (nombre y ID de instancia) dos veces.
Solución:
No intentes registrar la misma instancia de paquete de servicios (nombre e ID de instancia) dos veces.
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 de 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 puede crear un suscriptor, un observador, un historial ni un InstantReader
Error:
Unavailable error.
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
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 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 anulación del registro de publicadores
Se pueden producir errores cuando un publicador anula el registro mientras sus lectores aún están activos.
read_next_messages del suscriptor devuelve listas vacías
Error:
read_next_messages se ejecuta correctamente, pero devuelve listas vacías.
Causa:
Se anula el registro del publicador mientras sus lectores están activos.
Solución:
Usa un suscriptor o un historial con un flujo de disponibilidad. Si el último mensaje del flujo de disponibilidad no está disponible, se anula el registro del publicador y no hay mensajes nuevos.
El siguiente observador devuelve un error interno
Error:
next devuelve el error Internal.
Causa:
Se anula el registro del publicador mientras sus lectores están activos.
Solución:
Usa un suscriptor o un historial con un flujo de disponibilidad. Si el último mensaje de la transmisión de disponibilidad no está disponible, el publicador ya no existe y no hay mensajes nuevos.
El método read_from_history del historial no devuelve mensajes nuevos
Error:
read_from_history no devuelve ningún mensaje nuevo, solo devuelve mensajes
anteriores.
Causa:
Se anula el registro del publicador mientras sus lectores están activos.
Solución:
Usa un suscriptor o un historial con un flujo de disponibilidad. Si el último mensaje de la transmisión de disponibilidad no está disponible, el publicador ya no existe y no hay mensajes nuevos.
InstantReader read_latest_message devuelve un error interno
Error:
read_latest_message devuelve el error Internal.
Causa:
Se anula el registro del publicador mientras sus lectores están activos.
Solución:
Usa un suscriptor o un historial con un flujo de disponibilidad. Si el último mensaje de la transmisión de disponibilidad no está disponible, el publicador ya no existe y no hay mensajes nuevos.
Soluciona problemas de la cola de mensajes vacía
Se pueden producir errores cuando se intenta leer desde una cola de mensajes vacía.
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 un flujo de disponibilidad. Si el último mensaje del flujo de disponibilidad está disponible, el publicador está activo y no hay mensajes nuevos.
El siguiente observador devuelve un error interno
Error:
next devuelve el error Internal.
Causa:
El publicador está activo, pero no envió mensajes.
Solución:
Usa un suscriptor o un historial con un flujo de disponibilidad. Si el último mensaje del flujo de disponibilidad está disponible, el publicador 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 un flujo de disponibilidad. Si el último mensaje del flujo de disponibilidad está disponible, el publicador está activo y no hay mensajes nuevos.
InstantReader read_latest_message devuelve un error interno
Error:
read_latest_message devuelve el error Internal.
Causa:
El publicador está activo, pero no envió mensajes.
Solución:
Usa un suscriptor o un historial con un flujo de disponibilidad. Si el último mensaje del flujo de disponibilidad está disponible, el publicador está activo y no hay mensajes nuevos.
Soluciona problemas de desbordamiento del búfer o pérdida de datos
Se pueden producir errores cuando el publicador envía mensajes a un ritmo más rápido del que un lector puede consumirlos.
La primera lectura del suscriptor después de un desbordamiento devuelve un error DataLoss
Error:
read_next_messages devuelve el error DataLoss.
Causa:
El publicador envía mensajes a un ritmo más rápido del que un lector puede consumirlos.
Solución:
Estas son algunas posibles soluciones:
- Aumenta el búfer de anillo del publicador
capacityen la definición de la arquitectura de VSIDL para que la cola pueda absorber ráfagas de mensajes antes de que el suscriptor los lea. - Consume mensajes con más frecuencia en el suscriptor o reduce la tasa de mensajes del publicador.
- Usa un
InstantReaderen lugar de unSubscribersi tu servicio solo necesita el valor del mensaje más reciente y no necesita procesar cada actualización intermedia.
El primer next del observador después de un desbordamiento devuelve un error DataLoss
Error:
next devuelve el error DataLoss.
Causa:
El publicador envía mensajes a un ritmo más rápido del que un lector puede consumirlos.
Solución:
Estas son algunas posibles soluciones:
El publicador publica a un ritmo más lento. Por ejemplo, podrías tener una variable con la marca de tiempo del mensaje más reciente. Si la hora actual es menor que la hora de publicación más reciente más un delta, no publicas 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 muestra errores de desbordamiento y siempre muestra 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 (01) puede leerlos, puedes crear un publicador (P2) y un observador (02) nuevos para adaptar 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 leído a O1.
- O1 lee un mensaje cada diez segundos.
En el siguiente código de ejemplo, 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 copie el historial. No hay notificación directa de errores en la lectura.
Causa:
El publicador envía mensajes a un ritmo más rápido del que un lector puede consumirlos.
Solución:
Estas son algunas posibles soluciones:
- Aumenta el búfer en anillo del publicador
capacityen la definición de la arquitectura de VSIDL para queHistoryretenga suficientes mensajes recientes para el intervalo de sondeo del lector. - Lee desde
Historycon más frecuencia o reduce la velocidad a la que el publicador envía mensajes.
InstantReader solo lee el último mensaje
Error:
El mensaje se pierde antes de que se copie el historial. No hay notificación directa de errores en la lectura.
Causa:
El publicador envía mensajes a un ritmo más rápido del que un lector puede consumirlos.
Solución:
N/A
El cliente de RPC llama a un método y este no está disponible
Error:
La llamada de método falla con el error Unavailable.
Causa:
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 defina un server para la interfaz determinada que el cliente quiera usar.
La implementación del servidor devuelve un error de SdvStatus
Error:
La implementación del servidor devuelve un SdvResult que contiene un error SdvStatus, como SdvStatusCode::NotFound. El error se propaga de vuelta al cliente que realiza la llamada.
Causa:
La SDV y el sistema de comunicación entre el cliente y el servidor funcionan como se espera, 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 responder de forma correcta a esas solicitudes.