Je gère une application Java qui est occupée la plupart du temps. Lorsque je dois la mettre à jour, je lui envoie un message pour qu'elle quitte proprement l'application à la prochaine occasion, puis je mets à jour les fichiers de classe et je la redémarre. Ce que j'aimerais vraiment pouvoir faire, c'est mettre à jour les fichiers de classe, puis faire en sorte que le programme se lance lui-même à la prochaine bonne occasion, mais ce que j'ai découvert (il s'agit de Solaris), c'est que si vous modifiez les fichiers sur le disque alors qu'un programme est en cours d'exécution, il se passe parfois des choses fâcheuses. Je suppose que c'est parce que tous les fichiers de classe ne sont pas toujours présents dans le jvm et qu'il faut parfois les recharger à partir du disque, ou peut-être que solaris charge des parties du fichier qui ne correspondent pas à l'ancien binaire. Je l'ai vu faire cela avec des binaires C également. Des suggestions ? Il serait plus sûr de faire un déplacement et une copie pour que les mêmes informations du disque ne soient pas écrites, mais qu'un nouvel inode soit créé pour le nouveau fichier ?
Réponses
Trop de publicités?Examinez également la possibilité d'automatiser la mise à niveau en utilisant webstart (qui a des restrictions supplémentaires) ou en intégrant la mise à jour dans le script de démarrage, par exemple quelque chose comme ceci : 1. vérifier s'il y a des fichiers dans new/, les copier dans production 2. démarrer l'application
De cette manière, il suffit de redémarrer. Et vous pouvez copier, rsync, ftp, ...
L'écrasement des jars/classes ne fonctionne pas. La raison en est simple : une classe peut être chargée en mémoire, puis déchargée en raison de la pression exercée sur la mémoire, puis rechargée à nouveau. Si vous modifiez le fichier de classe sous-jacent, vous obtenez une nouvelle classe avec un ancien système, ce qui pose problème.
La meilleure solution consiste à intégrer le déploiement à chaud dans l'application (ou à demander aux développeurs de le faire) en utilisant des solutions telles que :
- chargement de classes personnalisées ;
- OSGI ;
ou ce qui vous convient le mieux.