La plupart des API de middleware renvoient un objet SdvResult. En cas de réussite, cet objet contient l'objet de résultat attendu. En cas d'échec, cet objet contient un objet SdvStatus, qui indique un comportement inattendu ou une condition d'erreur, souvent identifié par un code d'erreur, tel que Internal, Unavailable ou DataLoss.
Cette page vous aide à résoudre ces codes d'erreur.
Résoudre les problèmes d'enregistrement et de création
Les échecs d'enregistrement et de création se produisent généralement lorsque vous essayez de créer ou d'enregistrer un service non valide.
Impossible de créer un deuxième service
Erreur :
Internal erreur.
Cause :
Vous essayez d'enregistrer deux fois exactement la même instance de bundle de services (nom et ID d'instance).
Correctif :
N'essayez pas d'enregistrer deux fois la même instance de bundle de services (nom et ID d'instance).
Impossible de supprimer le bundle de services en double
Erreur :
Status(-3, EX_ILLEGAL_ARGUMENT)
Cause :
Vous essayez de supprimer un bundle de services en double qui n'existe pas.
Correctif :
N'essayez pas de supprimer un bundle de services en double qui n'existe pas.
Impossible de récupérer une instance d'éditeur pour envoyer des messages
Erreur :
L'appel à take_publisher renvoie none.
Cause :
Vous avez appelé take_publisher deux fois pour la même variante à partir de la même instance de bundle de services.
Correctif :
N'appelez pas take_publisher deux fois pour la même variante à partir de la même instance de bundle de services.
Impossible de créer un Subscriber, un Observer, un History ou un InstantReader
Erreur :
Unavailable erreur.
Cause :
Vous avez essayé de créer un Subscriber, un Observer, un History ou un InstantReader pour un éditeur qui n'existe pas ou qui a été désenregistré.
Correctif :
Vérifiez que l'éditeur existe ou est enregistré avant d'essayer de créer un Subscriber, un Observer, un History ou un InstantReader pour l'éditeur.
Impossible de créer le client RPC
Erreur :
Unavailable erreur
Cause :
Vous avez essayé de créer un client RPC pour un nom d'unité de serveur qui n'existe pas ou n'est pas enregistré.
Correctif :
Vérifiez que le serveur existe et qu'il est enregistré avant de créer le client RPC.
Résoudre les problèmes de communication
Des échecs de communication peuvent se produire après l'exécution d'un service et le début de la communication avec d'autres services.
Résoudre les problèmes de désenregistrement d'un éditeur
Des erreurs peuvent se produire lorsqu'un éditeur se désinscrit alors que ses lecteurs sont toujours actifs.
La méthode read_next_messages de l'abonné renvoie des listes vides
Erreur :
read_next_messages réussit, mais renvoie des listes vides.
Cause :
L'éditeur est désenregistré alors que ses lecteurs sont actifs.
Correctif :
Utilisez un abonné ou un historique avec un flux de disponibilité. Si le dernier message du flux de disponibilité n'est pas disponible, l'éditeur est désenregistré et il n'y a pas de nouveaux messages.
La méthode "next" de l'observateur renvoie une erreur interne
Erreur :
next renvoie l'erreur Internal.
Cause :
L'éditeur est désenregistré alors que ses lecteurs sont actifs.
Correctif :
Utilisez un abonné ou un historique avec un flux de disponibilité. Si le dernier message du flux de disponibilité n'est pas disponible, cela signifie que l'éditeur n'est plus là et qu'il n'y a pas de nouveaux messages.
"read_from_history" de l'historique ne renvoie pas les nouveaux messages
Erreur :
read_from_history ne renvoie aucun nouveau message, mais uniquement les anciens messages.
Cause :
L'éditeur est désenregistré alors que ses lecteurs sont actifs.
Correctif :
Utilisez un abonné ou un historique avec un flux de disponibilité. Si le dernier message du flux de disponibilité n'est pas disponible, cela signifie que l'éditeur n'est plus là et qu'il n'y a pas de nouveaux messages.
InstantReader read_latest_message renvoie une erreur interne
Erreur :
read_latest_message renvoie l'erreur Internal.
Cause :
L'éditeur est désenregistré alors que ses lecteurs sont actifs.
Correctif :
Utilisez un abonné ou un historique avec un flux de disponibilité. Si le dernier message du flux de disponibilité n'est pas disponible, cela signifie que l'éditeur n'est plus là et qu'il n'y a pas de nouveaux messages.
Résoudre les problèmes de file d'attente de messages vide
Des erreurs peuvent se produire lors de la tentative de lecture d'une file d'attente de messages vide.
La méthode read_next_messages de l'abonné renvoie une liste vide
Erreur :
read_next_messages renvoie une liste vide.
Cause :
L'éditeur est actif, mais n'a pas envoyé de messages.
Correctif :
Utilisez un abonné ou un historique avec un flux de disponibilité. Si le dernier message du flux de disponibilité est disponible, l'éditeur est actif et il n'y a pas de nouveaux messages.
La méthode "next" de l'observateur renvoie une erreur interne
Erreur :
next renvoie l'erreur Internal.
Cause :
L'éditeur est actif, mais n'a pas envoyé de messages.
Correctif :
Utilisez un abonné ou un historique avec un flux de disponibilité. Si le dernier message du flux de disponibilité est disponible, l'éditeur est actif et il n'y a pas de nouveaux messages.
"read_from_history" de l'historique ne renvoie pas les nouveaux messages
Erreur :
read_from_history renvoie une liste vide.
Cause :
L'éditeur est actif, mais n'a pas envoyé de messages.
Correctif :
Utilisez un abonné ou un historique avec un flux de disponibilité. Si le dernier message du flux de disponibilité est disponible, l'éditeur est actif et il n'y a pas de nouveaux messages.
InstantReader read_latest_message renvoie une erreur interne
Erreur :
read_latest_message renvoie l'erreur Internal.
Cause :
L'éditeur est actif, mais n'a pas envoyé de messages.
Correctif :
Utilisez un abonné ou un historique avec un flux de disponibilité. Si le dernier message du flux de disponibilité est disponible, l'éditeur est actif et il n'y a pas de nouveaux messages.
Résoudre les problèmes de dépassement de tampon ou de perte de données
Des erreurs peuvent se produire lorsque l'éditeur envoie des messages à un débit plus rapide que celui auquel un lecteur peut les consommer.
La première lecture de l'abonné après un dépassement renvoie une erreur DataLoss
Erreur :
read_next_messages renvoie l'erreur DataLoss.
Cause :
L'éditeur envoie des messages à un rythme plus rapide que celui auquel un lecteur peut les consommer.
Correctif :
Voici quelques solutions possibles :
- Augmentez le tampon circulaire de l'éditeur
capacitydans la définition de votre architecture VSIDL afin que la file d'attente puisse absorber les pics de messages avant que l'abonné ne les lise. - Consommez les messages plus fréquemment dans l'abonné ou réduisez le taux de messages de l'éditeur.
- Utilisez un
InstantReaderau lieu d'unSubscribersi votre service n'a besoin que de la dernière valeur de message et n'a pas besoin de traiter chaque mise à jour intermédiaire.
Le premier élément suivant de l'observateur après un dépassement de capacité renvoie une erreur DataLoss
Erreur :
next renvoie l'erreur DataLoss.
Cause :
L'éditeur envoie des messages à un rythme plus rapide que celui auquel un lecteur peut les consommer.
Correctif :
Voici quelques solutions possibles :
L'éditeur publie à un rythme plus lent. Par exemple, vous pouvez avoir une variable avec le code temporel du dernier message. Si l'heure actuelle est inférieure à l'heure de la dernière publication plus un delta, vous ne publiez pas le message. Grâce à ce mécanisme, un seul message par delta est publié.
Consumer utilise un objet
InstantReadau lieu d'un observateur. Un objetInstantReadne renvoie pas d'erreur de dépassement et renvoie toujours le dernier message. Si seul le dernier message vous intéresse, vous pouvez utiliser un objetInstantReadau lieu d'un observateur.Le consommateur implémente l'échantillonnage. Si votre solution comporte un éditeur (P1) qui publie des messages plus rapidement que l'observateur (01) ne peut les lire, vous pouvez créer un éditeur (P2) et un observateur (02) pour compenser la différence de vitesse de publication et de lecture.
Par exemple, supposons que P1 publie un message toutes les 10 ms, mais que O1 ne puisse lire qu'un seul message toutes les 100 ms et supprime les neuf messages restants. Pour résoudre l'écart, créez une solution qui suit les étapes suivantes :
- P1 publie des messages sur O2.
- O2 lit un message et en supprime neuf.
- O2 envoie le message lu à P2.
- P2 envoie le message lu à O1.
- O1 lit un message toutes les dix secondes.
L'exemple de code suivant montre comment implémenter ce scénario d'échantillonnage :
int discarded_message = 10; while (true) { message m = O2.read_message(); if discarded_message == 10 { discarded_message = 0; P2.publish(m); } else { discarded_message ++; } }
Les lectures de l'historique sont incomplètes
Erreur :
Le message est perdu avant la copie de l'historique. Aucune notification d'erreur directe en lecture.
Cause :
L'éditeur envoie des messages à un rythme plus rapide que celui auquel un lecteur peut les consommer.
Correctif :
Voici quelques solutions possibles :
- Augmentez le tampon circulaire de l'éditeur
capacitydans la définition de votre architecture VSIDL afin queHistoryconserve suffisamment de messages récents pour l'intervalle d'interrogation de votre lecteur. - Lisez
Historyplus fréquemment ou réduisez la fréquence à laquelle l'éditeur envoie des messages.
InstantReader ne lit que le dernier message
Erreur :
Le message est perdu avant la copie de l'historique. Aucune notification d'erreur directe en lecture.
Cause :
L'éditeur envoie des messages à un rythme plus rapide que celui auquel un lecteur peut les consommer.
Correctif :
N/A
Le client RPC appelle une méthode, mais celle-ci n'est pas disponible
Erreur :
L'appel de méthode échoue avec l'erreur Unavailable.
Cause :
SDV ne connaît pas le nom du serveur et renvoie Unavailable. Cette erreur est renvoyée par le middleware si la découverte des services ne renvoie pas de nom de serveur valide.
Correctif :
Démarrez un bundle de services qui définit un server pour l'interface donnée que le client souhaite utiliser.
L'implémentation côté serveur renvoie une erreur SdvStatus
Erreur :
L'implémentation côté serveur renvoie un SdvResult contenant une erreur SdvStatus, telle que SdvStatusCode::NotFound. L'erreur est propagée au client appelant.
Cause :
SDV et le système de communication entre le client et le serveur fonctionnent comme prévu, mais le client a envoyé une requête qui déclenche une erreur sur le serveur.
Correctif :
Envoyez une requête valide avec le client ou corrigez le serveur pour qu'il réponde correctement à ces requêtes.