Modification d'un procédé à l'exécution par l'intermédiaire d'un mécanisme de permutation à chaud

StackOverflow https://stackoverflow.com/questions/4553353

  •  13-10-2019
  •  | 
  •  

Question

Supposons que nous avons un programme Java trivial qui se compose d'une seule classe:

public class HelloWorld {

   private static void replacable(int i) {
      System.out.println("Today is a nice day with a number " + i);
   }        

   public static void main(String[] args) throws Exception {
      for(int i = 0; i < 100000; ++i) {
      replacable(i);
      Thread.sleep(500);
   }
}

Après il est compilé et exécuté, la sortie sera ceci:

  

Aujourd'hui est un jour agréable avec un nombre 0

     

Aujourd'hui est un jour agréable avec un numéro 1

     

Aujourd'hui est un jour agréable avec un numéro 2

     

Aujourd'hui est un jour agréable avec un numéro 3

     

...

Ma question: il existe (ou est-il à l'horizon) un moyen de permutation méthode replacable lors de l'exécution? Quelque chose comme écrire une autre version de HelloWorld avec une nouvelle version de replacable, la compilation, puis l'ancienne version dans une machine virtuelle Java fonctionne déjà?

Alors, si j'écris la nouvelle version comme ceci:

private static void replacable(int i) {
   System.out.println("Today is an even nicer day with a number " + i);
}  

est-il quelque chose de similaire à échange de code à chaud de Erlang où je peux le faire:

  1. exécuter le programme d'origine
  2. écriture version modifiée
  3. l'aide d'un programme de ligne de commande, se connecter à l'exécution JVM et remplacer méthode existante

de sorte que, pendant l'exécution, cela se produira:

  

Aujourd'hui est un jour agréable avec un nombre 15000

     

Aujourd'hui est un jour agréable avec un nombre 15001

     

Aujourd'hui est une journée encore plus agréable avec un nombre 15002

     

Aujourd'hui est une journée encore plus agréable avec un nombre 15003

     

...

On suppose que le programme ci-dessus est autonome, fonctionne dans un environnement standard Java SE, il n'y a rien d'autre sur classpath, il est donc presque un programme de style Bonjour tout le monde.

Note: Je sais que des technologies telles que la manipulation de bytecode ( cglib ), AspectJ , JRebel , JMX , hotswapping des méthodes Java EE etc. existent, mais ils ne sont pas ce que je pense. Pensez à Erlang.

Était-ce utile?

La solution

Vous pouvez utiliser l'open source HotSpot VM ou commerciale JRebel plug-in IDE pour atteindre facilement votre objectif (voir le tableau de comparaison ).

Autres conseils

Vous pouvez le faire via les chargeurs de classe. Par exemple, si vous connaissez des conteneurs Servlet tels que tomcat que les pages de recharge que vous les modifier dans le développement. Voici un grande explication de la création de code de dynamique java . Il explique non seulement le chargement, mais aussi la compilation de la source à la volée. Vous devriez être en mesure d'appliquer les concepts abordés à toute stratégie code rechargeant que vous souhaitez utiliser.

Je l'ai utilisé cette tâche hotswap fourmi dans de nombreux projets. L'application java cible peut être lancée via Ant, Eclipse, une invite de commande, ou tout autre moyen aussi longtemps qu'il est lancé en mode de débogage avec le port approprié ouvert. La page liée fournit des instructions sur la façon de le faire via Ant.

Un nombre quelconque de classes peut être hotswapped tant que les changements ne sont pas structurels. corps méthode change généralement hotswap avec facilité. Le code peut être hotswapped en exécutant un script ant via un shell ou Eclipse.

Au travail, j'utiliser un script code hotswaps change automatiquement en comparant les horodatages sur les fichiers de classe. Ceci est similaire à l'échantillon sur la page du projet qui montre un exemple simple qui ne hotswaps classes modifiées.

Note complémentaire: Il utilise le JPDA

Un poste un peu vieux, mais nous espérons que quelqu'un trouvera ce utile:

Je l'ai trouvé Hotswap Agent est bien documenté et riche en fonctionnalités (et le meilleur de tous, < a href = "https://github.com/HotswapProjects/HotswapAgent" rel = "nofollow"> open source).

Vous pouvez le faire via l'interface JPDA (Java Platform Debugger Architecture): http://download.oracle.com/javase/1.4.2/docs/guide/jpda/enhancements.html#hotswap

Il est pas automatique le cas Erlang - la machine virtuelle Java ne surveille pas le chemin de classe pour des modifications aux fichiers de classe puis recharger et les réassocier en cas de changement, pour des raisons assez évidentes (Java a été conçu pour le déploiement Web que vous ne voulez pas être une interrogation URL http des changements).

Qu'en est-il OSGi? Hot est sorta swapping « construit » à la spécification -. Je pense que ce serait une solution possible et

Vous pouvez utiliser le modèle de conception de stratégie, de sorte que vous avez un objet à manipuler plutôt qu'une méthode et un protocole de communication avec le programme pour lui dire d'utiliser un nom de classe donné que la classe de l'objet Stratégie.

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