[JAVA] Variables statiques et tomcat

Variables statiques et tomcat [JAVA] - Java - Programmation

Marsh Posté le 07-04-2004 à 10:38:05    

Salut à tous,
 
J'ai un gros problème dans le programme que je suis chargé de développer : un générateur de topologies et de trafic MPLS. Le but du projet est qu'on puisse se connecter à un serveur tomcat et demander la génération de topologies avec du trafic dessus, le tout en précisant certains paramètres.
 
Pour générer les topologies, je réutilise un programme existant nommé BRITE. En effet, vu la quantité de recherche que cela demande, il m'était impossible, en une année, de développer un programme qui lui est comparable. Le seul hic, c'est que ce programme n'est pas réellement prévu pour le genre d'utilisation que l'on souhaite en faire. Par exemple, il utilise des variables statiques pour assigner des identifiants uniques aux noeuds et aux liens de la topologie.
 
Vous voyez arriver le problème d'ici : si deux personnes demandent une génération en même temps, les identifiants de noeuds et de liens ne seront pas consécutifs...
 
Alors, voici la question : est-ce qu'il y aurait moyen de résoudre ce problème sans modifier le code de BRITE ? En obligeant tomcat à charger plusieurs fois la classe ou quelque chose dans ce genre ? Si je demande cela, ce n'est pas tellement parce que je suis fainéant mais c'est surtout parce que plus je le modifie, plus il sera difficile de changer de version de BRITE.
 
Merci d'avance (pour avoir lu jusque ici déjà :D et pour vos réponses).

Reply

Marsh Posté le 07-04-2004 à 10:38:05   

Reply

Marsh Posté le 07-04-2004 à 12:18:24    

Est-ce-que tu ne peux pas créer un objet qui accédéra au code de BRITE et dont toutes les méthodes seront synchronisées afin de t'assurer que les variables statiques ne seront pas modifiées par 2 threads différents ?

Reply

Marsh Posté le 07-04-2004 à 12:39:41    

machinbidule1974 a écrit :

Est-ce-que tu ne peux pas créer un objet qui accédéra au code de BRITE et dont toutes les méthodes seront synchronisées afin de t'assurer que les variables statiques ne seront pas modifiées par 2 threads différents ?


Si je fais ça, les clients seront servis chacun à leur tour l'un après l'autre. Ce n'est pas une mauvaise solution mais est-ce qu'il y aurait un moyen pour qu'on puisse quand même générer deux topologies en même temps ? Sinon les clients risquent d'attendre un paquet de temps (générer une topologie de 100000 noeuds, ça prend un peu de temps quand même).
 
Le problème est que si deux clients A et B sont présents simultanément, A aura, par exemple, un noeud d'ID 0 mais pas B (qui commencera à 1 ou 2 ou autre chose) ce qui est assez gênant.

Reply

Marsh Posté le 07-04-2004 à 12:44:02    

essaye de passer par ton propre classloader. Tu fais un nouveau classloader pour chaque utilisateur, et hop.
 
voir la doc de URLClassLoader

Reply

Marsh Posté le 07-04-2004 à 14:12:30    

lorill a écrit :

essaye de passer par ton propre classloader. Tu fais un nouveau classloader pour chaque utilisateur, et hop.
 
voir la doc de URLClassLoader


Ok merci, je vais regarder cela d'un peu plus près.

Reply

Marsh Posté le 07-04-2004 à 14:42:32    

lorill a écrit :

essaye de passer par ton propre classloader. Tu fais un nouveau classloader pour chaque utilisateur, et hop.


[:benou_jap]
 
les variables statics sont liées au classloader.
 
moi je ferais plutot un classloader par thread ... enfin ca dépend du type de traffic de ton site ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-04-2004 à 16:54:20    

Bon, j'ai essayé URLClassLoader et ça fais bien ce que je veux.  
 
Voilà ce que j'ai :

Code :
  1. import java.net.URLClassLoader;
  2. import java.net.URL;
  3. import java.lang.reflect.*;
  4. public class Main {
  5.     public static void main(String [] args) throws Exception {
  6. URL url = new URL("file://"
  7.     +System.getProperty("user.dir" )
  8.     +"/" );
  9. URL[] urls = {url};
  10. URLClassLoader classLoader = new URLClassLoader(urls, null);
  11. Class nodeClass = classLoader.loadClass("be.ac.ulg.montefiore.run.topgen.Brite.Graph.Node" );
  12. Constructor cons = nodeClass.getConstructors()[0];
  13. Object node = cons.newInstance(null);
  14. Method method = nodeClass.getMethod("getID", null);
  15. System.out.println(method.invoke(node, null));
  16. node = cons.newInstance(null);
  17. System.out.println(method.invoke(node, null));
  18. classLoader = new URLClassLoader(urls, null);
  19. nodeClass = classLoader.loadClass("be.ac.ulg.montefiore.run.topgen.Brite.Graph.Node" );
  20. cons = nodeClass.getConstructors()[0];
  21. node = cons.newInstance(null);
  22. method = nodeClass.getMethod("getID", null);
  23. System.out.println(method.invoke(node, null));
  24. node = cons.newInstance(null);
  25. System.out.println(method.invoke(node, null));
  26.     }
  27. }


 
Avec ça la sortie du programme est :


0
1
0
1


 
J'ai juste encore une question : est-ce qu'il y a moyen de caster l'objet retourné par cons.newInstance(null) en un objet Node. En faisant une recherche dans les archives, j'ai vu une réponse de Benou qui semblait affirmer que ce n'était pas possible mais je voudrais être sûr d'avoir bien compris.
 
Merci encore à vous en tout cas.

Reply

Marsh Posté le 07-04-2004 à 16:57:13    

C'est possible mais si tu mets en dur "(Node) tonObjet", ca va utiliser le classloader system pour caster. Hors l'instance tonObject a été créé à partir d'une class d'un autre class loader => tu vas te manger un classcastexception car, ca a beau être les mêmes classes, elles ne sont pas assignable car elles n'ont pas été chargées par le même classloader ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-04-2004 à 17:06:39    

benou a écrit :

C'est possible mais si tu mets en dur "(Node) tonObjet", ca va utiliser le classloader system pour caster. Hors l'instance tonObject a été créé à partir d'une class d'un autre class loader => tu vas te manger un classcastexception car, ca a beau être les mêmes classes, elles ne sont pas assignable car elles n'ont pas été chargées par le même classloader ...


Ouais... donc en gros pour appeler des méthodes sur "tonObjet", je suis obligé de passer par le package java.lang.reflect...

Reply

Marsh Posté le 07-04-2004 à 17:09:11    

Sigmund a écrit :


Ouais... donc en gros pour appeler des méthodes sur "tonObjet", je suis obligé de passer par le package java.lang.reflect...


nan pas forcément : tu peux dédier le travaille à une classe que tu chargeras via ton classloader et qui elle fera le boulot : si elle est gérée par ton classloader elle peux faire les appels direct à ton produit. Par contre, il faudra que les interco entre cette classe et le reste de l'appli (servlet, etc ...) soient faits de façon dynamique.


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 07-04-2004 à 17:09:11   

Reply

Marsh Posté le 07-04-2004 à 17:15:34    

benou a écrit :


nan pas forcément : tu peux dédier le travaille à une classe que tu chargeras via ton classloader et qui elle fera le boulot : si elle est gérée par ton classloader elle peux faire les appels direct à ton produit. Par contre, il faudra que les interco entre cette classe et le reste de l'appli (servlet, etc ...) soient faits de façon dynamique.


 
Ok, j'ai tout compris (comme quoi tout arrive hein :D ). Merci beaucoup :jap: .

Reply

Marsh Posté le 07-04-2004 à 17:26:37    

you're welcome :jap:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed