IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java EE Discussion :

chargement dynamique de classes


Sujet :

Java EE

  1. #1
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut chargement dynamique de classes
    bonjour
    précision préliminaire: je suis croyant mais pas encore pratiquant en JMS

    question:
    - sur une machine un producteur envoie un message contenant un objet
    - du coté de la machine récepteur on reçoit ce message mais on n'a pas la classe correspondante (eh oui ça arrive!)

    existe-t-il un mécanisme (plus ou moins standard ... ou déjà écrit par un autre) qui permette le chargement dynamique de la classe correspondante et la reconstitution "propre" de cet objet?

    On a déjà ça avec des mécanismes sur RMI (je penses à JINI) mais peut-on se passer d'écrire un ClassLoader qui fasse une demande à un serveur de classe (sur http par exemple)?

    merci pour tout tuyau ou suggestion

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    768
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 768
    Par défaut
    Bonjour,

    Croyant et pratiquant JMS, le messaging d'objet utilise le mécanisme de serialization des objets.
    Tu vas recevoir un java.io.Serializable, après tu en fais ce que tu veux.
    Le travail de JMS est terminé.

  3. #3
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par Jimmy_ Voir le message
    Bonjour,

    Croyant et pratiquant JMS, le messaging d'objet utilise le mécanisme de serialization des objets.
    Tu vas recevoir un java.io.Serializable, après tu en fais ce que tu veux.
    Le travail de JMS est terminé.
    moui.... mais si tu n'as pas la classe sous la main l'objet ne sera pas dé-serialisé!

    Il me semble (mais peut-être me trompes-je) que ça doit être assez courant d'avoir un producteur et un consommateur sur deux machines différentes avec la possibilité que le récepteur n'aie pas la bonne classe pour dé-serialiser....
    C'est un phénomène hyper-courant dans des architectures réparties (c'est pour ça que je citais "feu" JINI)

    edit: je peux écrire ma propre usine à gaz en faisant circuler des MarshalledObjects et en ayant mon propre ClassLoader coté récepteur ... mais pourquoi réécrire quelque chose qui a sans doute été déjà fait

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    768
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 768
    Par défaut
    Ceci dit, nous on s'envoie des Bytes on ne fait transiter que la 'charge utile'.

    Tu ne sais pas du tout l'objet que tu vas recevoir, même pas une liste d'objet possible ?

  5. #5
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par Jimmy_ Voir le message
    Tu ne sais pas du tout l'objet que tu vas recevoir, même pas une liste d'objet possible ?
    aucune chance... on est en informatique répartie: les machines sur le réseau peuvent inclure des codes nouveaux à tout moment et donc il faut que les machines réceptrices soient capables de récupérer dynamiquement ces codes.

    (pour moi ce n'est pas une situation exceptionnelle...)

  6. #6
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    JMS n'étant qu'une spécification, ils ne doivent pas avoir prévu ça dans l'API, si t'as besoin d'envoyer des informations dont la forme et la nature peut changer à tout moment pourquoi passer par la sérialisation Java.

    Je pense que le mieux c'est de sérialiser via un processus plus standard que celui proposé par Java.

    Il y a aucun miracle qui fera passer le code (comportement) de tes classes et celui de leurs dépendances.

    Je te conseille éventuellement de consulter la documentation de ton implémentation pour savoir comment la paramétrer et si par exemple tu peux spécifier le ClassLoader.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Février 2010
    Messages
    768
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 768
    Par défaut
    J'ai connu il fut un temps un middleware qui utilisait massivement l'introspection via l'API de reflection Java.

    Je ne sais pas si ton besoin est couvert par cette API. Surtout si tu n'as pas à priori l'objet sous le coude ou dans un jar.

  8. #8
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par Nemek Voir le message
    Je pense que le mieux c'est de sérialiser via un processus plus standard que celui proposé par Java.

    Il y a aucun miracle qui fera passer le code (comportement) de tes classes et celui de leurs dépendances.
    Sans faire de miracles ça se fait couramment dans d'autres contextes
    d'informatique répartie et Java est très bien fait pour ça.

    le seul truc est de savoir si quelqu'un l'a déjà fait dans un contexte JMS.

    Je te conseille éventuellement de consulter la documentation de ton implémentation pour savoir comment la paramétrer et si par exemple tu peux spécifier le ClassLoader.
    là tu as raison .... mais tu me demandes de lire une documentation!
    (de plus l'implantation des agents qui écrivent et lisent dans JMS doit être abstraite par rapport au produit support JMS -il y a une raison pour ça-)

  9. #9
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Toute solution impliquant le transport des classes serait propriétaire, et donc adieu l'abstraction.

    Transférer les classes ne résoud rien. Comment les utiliser puisqu'on ne les a jamais vues avant? RMI a un tout autre fonctionnement, il arrive qu'on code par exemple une fenetre coté serveur et qu'on l'envoie pour affichage au client par RMI. Je vois mal l'intéret de ce genre de chose en java. Un message se sont des données auquel le consommateur s'attends. Il faudrait plutot que vous revoyez votre formattage des messages. JMS est un bus à message, RMI est une interface permettant d'invoquer des méthodes à distance, la logique n'est donc pas la meme

    En "gros" MapMessage a été créé dans l'idée de plutot y tapper des List, des Map ou des choses dans ce gout la, pas des classes custom. Pour les structure complexes, préférer l'envoi d'un chaine JSON et son traitement coté client

  10. #10
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Toute solution impliquant le transport des classes serait propriétaire, et donc adieu l'abstraction.
    soit....

    Transférer les classes ne résoud rien. Comment les utiliser puisqu'on ne les a jamais vues avant?
    là je sais: le code recepteur fait de l'introspection puis utilise ces informations en fonction de tas de critères sur la nature de ses découvertes.

    la bonne idée serait sans doute de faire ces opérations avant d'envoyer le message mais il faut que je vérifie si les exigences de découplage permettent ça effectivement de façon réaliste (je veux dire c'est le code récepteur qui a sa logique de collecte/structuration/utilisation des informations et le code émetteur n'en a -presque- aucune idée)

  11. #11
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    mais pourquoi dans ce cas aller f*** ces données dans une classe qu'on sérialize après plutot que les mettre dans un truc genre JSON ou xml?

  12. #12
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    mais pourquoi dans ce cas aller f*** ces données dans une classe qu'on sérialize après plutot que les mettre dans un truc genre JSON ou xml?
    parce que ce sont de vraies classes pas simplement des structures de données.
    encore une fois utiliser des classes qu'on n'a jamais vu ni d'ève ni d'adam ça se fait pour des tas de raisons: ici le transfert des objets est asynchrone et obéit à une logique "message" au lieu d'être directement livré (comme en RMI ou JINI).

  13. #13
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    RMI a besoin que le Stub soit déployé sur le client RMI, non ?

    Si je cromprends bien tu veux également faire transiter les classes de tes objets ? Dans ce cas JMS n'est vraiment pas le bon choix.

    Car ce genre de système suppose une négociation entre les deux parties afin d'échanger au préalable les classes (comment gérer les différentes version d'une même classe ?).

    Ensuite l'envoie de données si tout est ok.


    Il ne faut pas oublier que dans JMS le broker doit être capable de stocker pour transmettre le message même si l'émetteur est déconnecté.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  14. #14
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Pour le problème de déploiement des classes, j'aborderais éventuellement le problème de cette façon:

    un repository central avec les classes de transfert en version X

    quand l'émetteur upgrade ses classes, il poste un message sur une queue précise (ou un topic persistant si de nombreux clients) disant à quelle version il passe. Le clients, en recevant ce message, se déconnectent, téléchargent la mise à jour et redémarrent.

  15. #15
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par Nemek Voir le message
    RMI a besoin que le Stub soit déployé sur le client RMI, non ?
    non.

    je reprends mon raisonnement à la base: dans un service comme "feu" JINI on recevait des objets dont on n'avait pas nécessairement la classe. Si la classe était inconnue le ClassLoader demandait la classe à l'émetteur et zou on pouvait se servir de cet objet (il s'agit bien d'objets avec un comportement pas de simples données emballées dans un objet).

    Naïvement je vois JMS comme un moyen de diffuser des objets sur la base du paradigme publish/subscribe. Le mot "message" est relativement trompeur à ce niveau: il ne s'agit pas forcément de données portant diagnostic d'un évènement mais bien de véritables objets. Dans ce cas il me semble évident que le récepteur n'a pas forcément la classe de l'objet reçu et qu'un mécanisme de chargement de classe doit rentrer en action. Je suis surpris que ça ne soit pas dans la spec et je serais encore plus surpris qu'une implantation (ou des librairies ad-hoc) ne traitent pas le problème.
    Avant de réaliser ça "à la main" je préfère profiter de librairies déjà écrites.

  16. #16
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par Nemek Voir le message
    Il ne faut pas oublier que dans JMS le broker doit être capable de stocker pour transmettre le message même si l'émetteur est déconnecté.
    tu veux dire que le broker doit aussi avoir la classe?
    il ne devrait pourtant pas avoir a deserialiser le flot d'octet .... je n'y connais rien mais ça me semble peu probable.

  17. #17
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Pour le problème de déploiement des classes, j'aborderais éventuellement le problème de cette façon:

    un repository central avec les classes de transfert en version X

    quand l'émetteur upgrade ses classes, il poste un message sur une queue précise (ou un topic persistant si de nombreux clients) disant à quelle version il passe. Le clients, en recevant ce message, se déconnectent, téléchargent la mise à jour et redémarrent.
    moui.... je vais réfléchir à cet aspect. (dans le cas d'espèce il y a peu de clients et beaucoup d'émetteurs).
    mais pourquoi se déconnecter et redémarrer?

  18. #18
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    non.
    RMI nécessite au moins l'interface. Il semblerait que non en faite.

    Citation Envoyé par professeur shadoko Voir le message
    je reprends mon raisonnement à la base: dans un service comme "feu" JINI on recevait des objets dont on n'avait pas nécessairement la classe. Si la classe était inconnue le ClassLoader demandait la classe à l'émetteur et zou on pouvait se servir de cet objet (il s'agit bien d'objets avec un comportement pas de simples données emballées dans un objet).
    Là clairement le protocole de base de JMS n'est pas fait pour ça.

    Citation Envoyé par professeur shadoko Voir le message
    Naïvement je vois JMS comme un moyen de diffuser des objets sur la base du paradigme publish/subscribe. Le mot "message" est relativement trompeur à ce niveau: il ne s'agit pas forcément de données portant diagnostic d'un évènement mais bien de véritables objets. Dans ce cas il me semble évident que le récepteur n'a pas forcément la classe de l'objet reçu et qu'un mécanisme de chargement de classe doit rentrer en action. Je suis surpris que ça ne soit pas dans la spec et je serais encore plus surpris qu'une implantation (ou des librairies ad-hoc) ne traitent pas le problème.
    Avant de réaliser ça "à la main" je préfère profiter de librairies déjà écrites.
    Un message c'est une donnée, pas un comportement.

    Citation Envoyé par professeur shadoko Voir le message
    tu veux dire que le broker doit aussi avoir la classe?
    il ne devrait pourtant pas avoir a deserialiser le flot d'octet .... je n'y connais rien mais ça me semble peu probable.
    Le broker ne fait certes que transiter des bytes mais si tu veux échanger les classes c'est pas le broker qui va les stocker !

    Citation Envoyé par professeur shadoko Voir le message
    moui.... je vais réfléchir à cet aspect. (dans le cas d'espèce il y a peu de clients et beaucoup d'émetteurs).
    mais pourquoi se déconnecter et redémarrer?
    Un classloader ne peut maintenir qu'une seule version d'une classe. Une fois que tu auras récupérée une version tu pourras plus la faire évoluer.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  19. #19
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    tu veux dire que le broker doit aussi avoir la classe?
    il ne devrait pourtant pas avoir a deserialiser le flot d'octet .... je n'y connais rien mais ça me semble peu probable.
    Non, ce qu'il veux dire c'est que le récepteur doit être capable de lire le message même si l'émetteur (qui est le seul pouvant fournir les classes manquantes) est arrêté. Hors si t'as besoin de contacter l'émetteur pour avoir les classes manquantes, t'as un problème.

  20. #20
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    moui.... je vais réfléchir à cet aspect. (dans le cas d'espèce il y a peu de clients et beaucoup d'émetteurs).
    mais pourquoi se déconnecter et redémarrer?
    Parce que ça évite de se faire chier avec des classloader bidouilleé. C'est plus basé sur le système "mise à jour automatique" qui est plus facile à mettre en oeuvre

Discussions similaires

  1. "Chargement dynamique" de classe
    Par moutanakid dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/02/2008, 16h37
  2. Erreur chargement dynamique de class
    Par rastakouair dans le forum Langage
    Réponses: 1
    Dernier message: 16/12/2007, 16h42
  3. Chargement dynamique de classe et version de java
    Par TabrisLeFol dans le forum Général Java
    Réponses: 8
    Dernier message: 15/02/2007, 17h13
  4. [Classpath][Classloader]Chargement dynamique de classes
    Par vberetti dans le forum Général Java
    Réponses: 9
    Dernier message: 08/07/2005, 12h11
  5. [tomcat]chargement dynamique de classes depuis une webapp
    Par alphamax dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 12/03/2004, 09h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo