Une fois l'enregistrement traité, le serveur qui a reçu la demande d'enregistrement envoie le message SC_REPLY sur la connexion TCP ouverte par le client. Le serveur ferme la connexion. Le client doit laisser la connexion TCP ouverte jusqu'à ce que le serveur lui transmette le message SC_REPLY.
Par exemple, le client :
Ouvre une connexion TCP sur le serveur.
Attend que la connexion devienne « inscriptible ».
Envoie un message SC_CALLBACK_REG (contenant un message ADD_CLIENT).
Attend un message SC_REPLY du serveur.
Reçoit un message SC_REPLY du serveur.
Reçoit un message stipulant que le serveur a fermé la connexion (lecture de 0 octet du socket).
Ferme la connexion.
Un peu plus tard, le client :
Ouvre une connexion TCP sur le serveur.
Attend que la connexion devienne « inscriptible ».
Envoie un message SC_CALLBACK_REG (contenant un message REMOVE_CLIENT).
Attend un message SC_REPLY du serveur.
Reçoit un message SC_REPLY du serveur.
Reçoit un message stipulant que le serveur a fermé la connexion (lecture de 0 octet du socket).
Ferme la connexion.
Chaque fois que le serveur reçoit un message SC_CALLBACK_REG d'un client, il envoie, sur la même connexion ouverte, un message SC_REPLY indiquant si l'opération a réussi ou échoué. DTD XML SC_REPLY contient la DTD XML d'un message SC_REPLY, ainsi que les éventuels messages d'erreur que ce message peut contenir.
Un message SC_REPLY indique si une opération a réussi ou a échoué. Il contient la version du message de protocole CRNP, un code d'état et un message d'état décrivant le code d'état plus en détail. Le tableau suivant présente les valeurs possibles du code d'état :
Code d'état |
Description |
---|---|
OK |
Le message a été traité avec succès. |
RETRY |
La connexion du client a été rejetée par le serveur à cause d'une erreur temporaire. Le client doit faire une nouvelle tentative de connexion avec d'autres arguments. |
LOW_RESOURCE |
Les ressources du cluster sont faibles, le client peut seulement réessayer ultérieurement. L'administrateur du cluster peut également en augmenter les ressources. |
SYSTEM_ERROR |
Un incident grave s'est produit. Contactez l'administrateur du cluster. |
FAIL |
Le refus d'une autorisation ou tout autre incident a provoqué l'échec de la connexion. |
MALFORMED |
La requête XML est malformée et n'a pas pu être analysée. |
INVALID |
La requête XML n'est pas valide, c'est-à-dire qu'elle n'est pas conforme aux spécifications XML. |
VERSION_TOO_HIGH |
La version du message est trop élevée pour que le message soit traité avec succès. |
VERSION_TOO_LOW |
La version du message est trop basse pour que le message soit traité avec succès. |
Dans des conditions normales, un client qui envoie un message SC_CALLBACK_REG reçoit une réponse précisant si l'enregistrement a réussi ou a échoué.
Toutefois, le serveur peut être confronté à une condition d'erreur pendant l'enregistrement, ce qui l'empêche de transmettre un message SC_REPLY au client. L'enregistrement a pu réussir avant l'erreur, échouer ou ne pas avoir été traité.
Étant donné que le serveur doit fonctionner en tant que serveur de basculement ou de haute disponibilité dans le cluster, cette condition d'erreur ne signifie pas que le service est interrompu. De fait, le serveur peut rapidement commencer à envoyer des événements au client nouvellement enregistré.
Pour pallier ces conditions, votre client doit effectuer les opérations suivantes :
Imposer un délai d'expiration au niveau de l'application pour les connexions d'enregistrement en attente d'un message SC_REPLY, délai après lequel il devra réessayer de s'enregistrer.
Commencer à écouter son adresse IP de rappel et son numéro de port en vue de recevoir des notifications d'événement avant d'être enregistré pour la notification de rappel d'événement. Il doit attendre un message de confirmation d'enregistrement et des notifications d'événements en parallèle. S'il commence à recevoir des notifications d'événements avant de recevoir un message de confirmation, il doit fermer la connexion d'enregistrement.