Résoudre les problèmes d'échec de l'API Middleware

La plupart des API de middleware renvoient un objet SdvResult. En cas de succès, cet objet contient l'objet de résultat attendu. En cas d'échec, cet objet contient un objet SdvStatus, indiquant un comportement inattendu ou une condition d'erreur, souvent identifiés 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 :

Erreur Internal.

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 exactement la même instance de bundle de services (nom et ID d'instance).

Impossible de supprimer le forfait 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 abonné, un observateur, un historique ou un InstantReader

Erreur :

Erreur Unavailable.

Cause :

Vous avez essayé de créer un Subscriber, Observer, History ou InstantReader pour un éditeur qui n'existe pas ou qui a été désinscrit.

Correctif :

Vérifiez que l'éditeur existe ou est enregistré avant d'essayer de créer un Subscriber, Observer, History ou 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 échecs 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.

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ésinscrit 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ésinscrit et aucun nouveau message n'est disponible.

next() de l'observateur renvoie une erreur interne

Erreur :

next() renvoie l'erreur Internal.

Cause :

L'éditeur est désinscrit 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 a disparu 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.

Cause :

L'éditeur est désinscrit 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 a disparu 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ésinscrit 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 a disparu et qu'il n'y a pas de nouveaux messages.

Résoudre les problèmes liés à une file d'attente de messages vide

Des erreurs peuvent se produire lorsque vous essayez de lire 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, cela signifie que l'éditeur est actif et qu'il n'y a pas de nouveaux messages.

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, cela signifie que l'éditeur est actif 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() 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, cela signifie que l'éditeur est actif 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 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, cela signifie que l'éditeur est actif et qu'il n'y a pas de nouveaux messages.

Résoudre les problèmes de dépassement de mémoire tampon ou de perte de données

Des erreurs peuvent se produire lorsque l'éditeur envoie des messages à un rythme plus rapide que celui auquel un lecteur peut les consommer.

La première lecture d'un abonné après un dépassement de capacité renvoie une erreur DataLoss

Erreur :

read_next_message() renvoie l'erreur DataLoss.

Cause :

L'éditeur envoie des messages à un rythme plus rapide que celui auquel un lecteur peut les consommer.

Correctif :

La première méthode next() 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.

Solution : voici quelques solutions potentielles :

  • 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 à la dernière heure de publication plus un delta, ne publiez pas le message. Grâce à ce mécanisme, au maximum un message par delta est publié.

  • Le consommateur utilise un objet InstantRead au lieu d'un observateur. Un objet InstantRead ne renvoie pas d'erreurs de dépassement de capacité et renvoie toujours le dernier message. Si seul le dernier message vous intéresse, vous pouvez utiliser un objet InstantRead au 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 nouvel éditeur (P2) et un nouvel observateur (02) pour tenir compte de 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 autres messages. Pour résoudre l'écart, créez une solution en suivant ces étapes :

    1. P1 publie des messages sur O2.
    2. O2 lit un message et en supprime neuf.
    3. O2 envoie le message lu à P2.
    4. P2 envoie le message lu à O1.
    5. 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 n'est envoyée lors de la lecture.

Cause :

L'éditeur envoie des messages à un rythme plus rapide que celui auquel un lecteur peut les consommer.

Correctif :

InstantReader ne lit que le dernier message

Erreur :

Le message est perdu avant la copie de l'historique. Aucune notification d'erreur directe n'est envoyée lors de la 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 qui n'est pas disponible

Erreur :

L'appel de méthode échoue et renvoie 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 de service 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 :

La validation 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 puisse répondre correctement à ces requêtes.