Question

Nous avons une application client RMI écrit en Java qui doit envoyer des messages périodiques « rester en vie » à une application serveur. Nous avons mis en place cela comme un fil de rythme cardiaque séparé, qui envoie le message du programme vivant au serveur, puis dort pendant 15 secondes à l'aide Thread.sleep ().

Le fil est défini comme priorité:

Thread heartbeatThread = new Thread(new HeartbeatRunnable(server));
heartbeatThread.setPriority(Thread.MAX_PRIORITY);
heartbeatThread.start();

Cependant, lorsque la case sur laquelle le client est en cours d'exécution utilise beaucoup de CPU, nous constatons que les battements de coeur sont manqués, ce qui provoque le serveur d'assumer notre application cliente est mort.

Nous avons ajouté Thread.yield () dans mon thread principal, bien que cela n'a pas fait disparaître le problème.

Est-il possible de garantir que les battements de coeur sont envoyés à temps pendant que ma demande est toujours en cours?

Était-ce utile?

La solution

Vous pouvez implémenter le filetage en mode utilisateur dans un environnement non-thread en diffusant généreusement une fonction d'auto-écrit « rendement » dans votre code.

De même, vous pouvez librement disperser les appels de fonction de contrôle rythme cardiaque dans votre code. Renoncer le fil, il suffit d'appeler régulièrement une fonction de rythme cardiaque qui vérifie si un battement de coeur doit encore être envoyé.

Il est une solution brute, mais étant donné que vous avez essayé la bonne solution et il ne fonctionne pas, peut-être est quelque chose que vous devez revenir à.

En fait ce que vous pouvez faire est de placer une macro au début de chaque appel de fonction, qui effectue une vérification rapide sur le temps et appelle la fonction cardiaque en cas de besoin.

(Ah, avez-vous des macros en Java Je ne pense pas - mais vous voyez l'idée)

.

Autres conseils

Vous ne pouvez pas garantir vraiment. Vous pouvez envoyer le rythme cardiaque dans un autre thread pour éviter le temps qu'il faut pour envoyer le rythme cardiaque ajouté à votre retard. Il peut également être souhaitable de fixer le délai entre deux battements de cœur à la moitié du temps le serveur utilise pour déterminer un client est mort, à savoir si votre serveur expire votre client au bout de 15 secondes, (essayer de) envoyer un battement de coeur toutes les 7,5 secondes.

Cela dépend de ce processus utilise la CPU.

Si ce n'est pas votre processus, et donc le processus client est vraiment ne répond pas, alors il est à toutes fins utiles non en vie, afin de ne pas envoyer un heartbeart est approprié. Avoir un message de battement de coeur qui dit: « Je suis et peut traiter des messages » lorsque la boîte est trop chargé pour faire ce serait trompeur.

Si l'intention du message de battement de coeur est-à-dire « ce processus est en cours d'exécution, mais il pourrait être une demi-heure jusqu'à ce que je vous recontacterons », ont alors tout ce qui est en train de faire que le traitement envoyer ce message au serveur. Ou définir le délai à celui qui correspond à la réactivité du client.

Vous devez configurer le nombre de « battements de coeur manqués » que le serveur attend avant de décider que le client est indisponible.

Ainsi, par exemple, si votre intervalle de rythme cardiaque est de 15 secondes et le nombre de battements de coeur manqué est 4, le serveur attendra jusqu'à un maximum de 60 secondes (1 min) avant de décider que le client est injoignable.

Peut-être la meilleure solution serait d'utiliser de minuterie scheduleAtFixedRate . Avec cela, si l'on retards d'exécution (qui ne peuvent pas être évités en Java), les appels suivants ne seront pas affectés.

Si vous voulez que le serveur pour annoncer qu'il est en vie, vous pouvez être mieux présenter un socket ouvert. Sur votre client simplement lu à partir de cette prise. Il va bloquer (depuis votre serveur ne met rien écrit), et si le serveur disparaît / arrête votre client obtiendra une IOException indiquant que la prise serveur / port a disparu.

Ce ne sera pas en fonction du serveur fournissant des battements de coeur en temps opportun. Il utilise peu de ressources (un port TCP sur le côté serveur et à côté de pas de bande passante) et il est temps de révéler lorsque le serveur (ou à la machine serveur) devient indisponible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top