Comment écrire un démon Java
Ce sera une application réseau qui sera toujours (ou presque, comme toujours, que je peux gérer) être à l'écoute sur un port donné.
Je suis assez nouveau à Java, et de très nouveau pour les non-serveur web côté de la programmation, donc j'aimerais avoir des retours de la communauté sur mes hypothèses et des plans préliminaires.
J'ai lu sur jsvc ( http://commons.apache.org/daemon/jsvc.html ) et je suis actuellement en exploitation sur l'hypothèse que c'est la "meilleure" façon d'écrire un démon en java pour linux (probablement en cours d'exécution centOS).
Nagios peut être configuré pour surveiller si oui ou non mon démon est en cours d'exécution, et de m'informer ou de la sys admin quand il ne l'est pas? (Je suppose que oui, mais je ne suis pas très douée sys admin type)
Ce sera un SMPP application client (ou de l'ESME application je suppose) c'est pourquoi j'ai choisi Java comme cela semble être une très mature plate-forme pour le SMPP. Cependant, je sais que c'est plus "traditionnel" pour écrire un démon en C/C++. Moderne, Java, spectacle assez simples tâches, suis-je susceptible de courir en toute inconvénients majeurs?
Quelle est la meilleure façon de gérer le déploiement de nouvelles versions? Juste arrêter le démon et remplacer le binaire le plus rapidement possible et de le redémarrer?
Toute autre entrée serait grandement apprécié.
Si vous êtes attaché à une machine unique, vous pouvez utiliser l'astuce suivante: laisser les "vieux" démon de l'exécution (par exemple sur le port 8080, dont 80 redirige vers), puis de déployer un nouveau démon (par exemple sur le port 8081). Tester que tout fonctionne bien et une fois que vous êtes sûr que votre nouveau démon est bon d'aller, il suffit de changer le port de redirection 80->8080 à 80->8081. La seule fois root est nécessaire pour une telle chose est de changer le pare-feu les redirections. Sur les systèmes Unix, vous pouvez installer Java et Tomcat sans jamais avoir à se connecter en tant que root (tant que vous ne l'utilisez pas tout .deb ou .rpm packages).
Je pense que vous avez raison au sujet de jsvc, et votre suggestion pour la redirection des ports est génial et je vais probablement le faire. Merci!
attendez, ne vous méprenez pas: je ne critique pas jsvc (je ne sais pas). Je dis juste que la partie qui dit qu'il aide à exécuter Java choses comme root, je ne suis pas grand fan 🙂 Il peut faire d'autres choses utiles. Mais la redirection de port de chose qui fonctionne pour vous et si vous êtes dans le contrôle de la machine, c'est vraiment facile et pratique et relativement "safe" (au moins, vous n'avez pas besoin d'installer Java en tant que root).
Dans une réponse à l'OP dit "Ma question est assez vague pour qu'il n'y a pas de "vrai" réponse"
OriginalL'auteur Aaron Bruce | 2011-10-18
Vous devez vous connecter pour publier un commentaire.
Nous avons un certain nombre de 24/365 applications sur nos serveurs Linux qu'il suffit d'appeler le Java comme suit -- pas besoin de tout C wrappers:
Que mettre le bocal en cours d'exécution en arrière-plan (
nohup ... &
) sans entrée (< /dev/null
) et la sortie (stdout et stderr) redirigé vers un fichier de log (> output.log 2>&1
). Nous avons distribué la journalisation des infrastructures, mais certains sortie de la console (comme le fil décharges) est toujours prévu. Ces applications peuvent fonctionner pendant des mois jusqu'à ce que nous leur mise à niveau.En termes de surveillance, il ya beaucoup que vous pouvez faire. Nagios ressemble à un JMX plugin pour tester les informations que
jconsole
affiche. Il y a aussi beaucoup de natifs de JMX de journalisation et de surveillance des utilitaires. Nous avons à l'interne vert/jaune/rouge des indicateurs qui peut être tiré vers le haut à l'aide de JMX et facilement vérifiée. J'ai aussi exporté un simple JMX/service HTTP de chaque demande afin de fournir des informations d'état le rendant facile pour la 3ème partie outils de surveillance pour détecter les pannes.Je suppose que vous voulez dire SMPP? Si oui, alors je vois pas pourquoi Java ne pouvais pas faire un bon travail. Nos applications de réaliser une grande variété de HTTP, UDP, SMTP, JDBC, LDAP, et d'autres protocoles en temps réel. Nous utilisons Jgroups à beaucoup qui accomplit une complète authentifié, crypté, pile réseau en Java.
En termes de remplacement de l'exécution d'un binaire à la volée, qu'il est plus compliqué. Nous avons Vip à l'avant et remplacer les fichiers binaires à nos loisirs. Nos protocoles internes sont conçus pour le basculement. Si vous n'avez pas de VIP alors une chose à considérer serait ordonnée de transfert. Vous démarrez le nouveau pot et il parle à l'application d'utiliser l'ancien pot quand il est prêt à se lier au nouveau port. Puis l'ancienne application se délie et le nouveau on se lie immédiatement après. Quelque chose comme ça.
Espère que cette aide.
Certains ont-ils un s'il vous plaît décrire le script Linux écrit ?
Je le décris ci-dessous à droite dans la réponse @BasitAnwer.
OriginalL'auteur Gray
Si vous voulez vraiment avoir quelque chose de course non-stop sur *nix, je vous recommande de regarder daemontools.
Il y a quelques exemples sur la façon de faire ici et ici.
Fondamentalement svscan se frayer un processus qui surveille votre processus java à partir d'init, et à chaque fois il se bloque, il obtient redémarré.
daemontools
pourrait l'aider. Je pense à une participation plus active de suivre les pings l'application est dans l'ordre.Pendant le développement, ils ne le font pas, mais, une fois en production, ils le font. pour krico +1 daemontools code est moche et vieux, mais il fonctionne encore.
Hein. J'ai d'exécuter des applications java dans un cluster en production depuis des années, avec peut-être une poignée de VM défauts. Suppose que cela dépend de la JVM / OS.
Juste parlé à mon ops gars. Le dos de la serviette de calcul, c'est que nous avons accumulé 900+ mois de 24/7 application java runtime dans la production (~18 serveurs, 4 ans et+) et il s'en souvienne 0 (zéro) une fois que la machine virtuelle en défaut. Je suis assez sûr que je me souviens 1 fois, mais il pourrait avoir été une panique du noyau. Encore une fois, nous avait de mémoire et d'autres applications des défauts, mais très peu (le cas échéant) VM "accidents".
C'est assez rare pour les machines virtuelles à la faute, mais daemontools est déjà utile juste pour les rares cas. Mon approche est parfois réellement la force d'un arrêt dans le cas d'une exception irrécupérable, et de compter sur daemontools pour apporter de l'application de retour à la vie. Exemple très simple serait de capture OOM(e){ System.exit(-1); }.
OriginalL'auteur krico