J'ai un système que nous utilisons ici qui semble fonctionner plutôt bien avec les services. Notre système déployé compte environ 20 à 30 services à tout moment. Au travail, nous utilisons un produit appelé TopShelf que vous pouvez trouver ici http://topshelf-project.com/
Fondamentalement TopShelf gère beaucoup de choses liées au service. Installation, désinstallation etc tout de la ligne cmd du service. L'une des fonctionnalités les plus utiles est la possibilité de fonctionner en tant que console pour le débogage. Vous créez un service et, avec une ligne de commande cmd différente, vous pouvez l'exécuter en tant que console pour voir la sortie du service. Nous avons ajouté une fonctionnalité personnalisée à ce logiciel qui nous permet de configurer les profils à l'avance. Fondamentalement, nos profils configurent quelques choses comme la journalisation, l'emplacement des ressources, etc. afin que nous puissions contrôler tout cela sans avoir à republier de code. Tout ce que nous faisons est de lancer une commande comme
D: \ Services \ ServiceName.exe Core.Profiles.Debug ou
D: \ Services \ ServiceName.exe Core.Profiles.Production
pour obtenir différentes configurations de journalisation. Notre script de construction crée les scripts install.cmd et uninstall.cmd pour chacun de nos services. Tout ce que nous faisons est de copier les fichiers sur le serveur et d'exécuter le script. Si nous voulons voir la sortie de débogage, nous arrêtons le service et double-cliquez sur l'exe et nous obtenons une console pour lire toute la sortie.
Une chose de plus qui a topshelf que nous n'utilisons pas parce que ce n'est pas nécessaire est le concept de rayonnage (il y a de la documentation sur ce site pour cela). Cela vous permet de mettre à jour le service sans avoir à "redémarrer" mais vous devez toujours copier les fichiers manuellement sauf si vous construisez un système automatisé pour cela. Cependant, ma suggestion si vous avez besoin de la disponibilité de service de 100% est d'avoir un système redondant. Quelle que soit la manière dont vous configurez votre service pour les mises à jour, vous ne pouvez pas éviter les défaillances matérielles provoquant des temps d'arrêt sans un système de basculement automatique. Si le système en question était en place, ma stratégie de mise à jour recommandée consisterait à éteindre 1 nœud, à mettre à jour, à tester, à éteindre l'autre nœud, à mettre à jour, à tester et à rallumer le 2e nœud. Vous pouvez le faire bien sûr avec un script simple. Cela peut être un système plus compliqué que ce dont vous avez besoin, mais si vous ne pouvez pas prendre un service hors connexion pour un redémarrage simple qui prend 5 secondes, vous avez vraiment besoin d'un système pour résoudre les problèmes matériels.
Voir aussi http://stackoverflow.com/questions/4002462/how-can-i-write-a-java-application-that-can-update-itself-at-runtime/4002465#4002465 –