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

Langage Java Discussion :

Détecter quand un proxy dynamique est envoyé au garbage collector


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Février 2013
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 34
    Points : 43
    Points
    43
    Par défaut Détecter quand un proxy dynamique est envoyé au garbage collector
    Bonjour !

    Je développe en ce moment une API qui permet de faire des appels de fonctions distantes sans trop ce prendre la tête.
    J'ai une façade qui me permet de récupérer des implémentations.
    En gros, je fais sur ma machine locale ,IGestionDeFichier gdf = this.reseau.getImplem(IGestionDeFichier.class), et ça me sort un objet gdf, sur lequel je peux avoir accès aux méthodes. Les opérations sont exécutées sur un serveur distant.

    GDF est issu d'une usine à gaz assez propre, et est en fait un "proxy dynamique".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void creerRepertoire(IReseau reseau,String rep)
    {
    IGestionDeFichier gdf = reseau.getImplem(IGestionDeFichier.class);
    /* ... */
    gdf.creerRepertoire(rep);
    }
    Et mon soucis .. c'est que à la fin de la fonction, je veux que le réseau soit prévenu quand l'objet "gdf" est inutilisé par ma machine locale, pour vider du cache dans le serveur.
    Ce cache, coté serveur, contient une table identifiant->objet réel.

    Techniquement parlant, quand je fais reseau.getImplem, je dis au serveur
    "Donne moi un objet qui est de type IGestionDeFichier "
    le serveur me répond
    "Voici ton objet, c'est le #21546"

    Ensuite quand je fais "creerRepertoire", je dis au serveur
    "Appelle moi la 3e fonction de l'interface que je t'ai demandé, sur l'objet #21546 avec l'argument TOTO please"


    Et a aucun moment, je lui dit
    "Oublie l'objet #21546"


    Pour les objets "normaux", il suffit de spécifier la méthode finalize() qui est appelée lorsque l'objet rentre dans le garbage collector.
    Cependant, voila: je ne peux pas la spécifier, j'utilise un proxy dynamique; mes objets sont créés comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		T result = (T) Proxy.newProxyInstance(expected.getClassLoader(), new Class<?>[]{expected}, ih);
    		return result;
    avec ih un InvocationHandler qui communique avec le réseau.
    J'ai essayé de spécifier la méthode finalize() de l'invocation handler, mais elle n'est jamais appellée ..

    Voila, si quelqu'un a une once de solution, je suis preneur.


    En attendant, j'ai une solution un peu moche:
    j'ai crée une fonction DUMMY_CLOSE() dans mon IGestionDeFichier, et mon réseau a une fonction
    setFinalizeMethod()

    quand je fais gdf.DUMMY_CLOSE(), le réseau va tout d'abord executer la fonction, puis oublier l'objet.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par BorisTheBear Voir le message
    En attendant, j'ai une solution un peu moche:
    j'ai crée une fonction DUMMY_CLOSE() dans mon IGestionDeFichier, et mon réseau a une fonction
    setFinalizeMethod()
    C'est pour moi la meilleure solution, car cela permet de maitriser précisément le moment où on libèrera les ressources.

    Perso j'hériterais carrément de l'interface AutoCloseable afin d'utiliser la méthode close() (c'est assez "standard" en Java). Du coup le ProxyHandler peut gérer particulièrement cette méthode.



    Sinon tu dépend fortement des aléas du GC, qui ne va pas forcément libérer tes objets au plus tôt (car ils ne représentent pas forcément une priorité).



    Maintenant si tu veux mettre un garde-fou, il faut passer par des PhantomReference et une ReferenceQueue, qui te permettront d'être au courant du moment où la référence sera perdu...



    a++

  3. #3
    Membre du Club
    Inscrit en
    Février 2013
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 34
    Points : 43
    Points
    43
    Par défaut
    La solution d'appeler une méthode supplémentaire m'horripile en fait, parce que je n ai pas toujours le contrôle des interfaces..
    Je pense que je vais boucler sur un ensemble de weakreferences de temps en temps pour voir celles qui passent à null...
    Bref, pas de solution hors du chapeau quoi !
    Hormis de faire une api avec un start et un stop et une purge en fonction de la stacktrace des objets créés . Mais ça ca marche que si les objects sont créés entre le start et stop.. dans le méme thread

  4. #4
    Membre du Club
    Inscrit en
    Février 2013
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Février 2013
    Messages : 34
    Points : 43
    Points
    43
    Par défaut
    Bon, j'ai résolu un énorme problème:
    En effet, mon objet provient du réseau, du coup, les flux de sérialisation détenaient des références vers celui-ci..


    Second problème!

    Il faut *toujours* garder les référence vers les références phantômes...

    Moi je me contentait de faire un new RefObjectReseau(id,invocationHandler) .. mais non !
    il faut les stocker quelque part ..
    Donc j'ai mis une liste bidon, et je stocke tout dedans, et je dépile quand ma réf. phantôme arrive dans la ReferenceQueue ..

Discussions similaires

  1. [XL-2007] Détecter quand la fenêtre est diminuée ou agrandie
    Par XceSs dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/05/2012, 19h46
  2. Détecter quand une touche est pressée.
    Par Simonake dans le forum Langage
    Réponses: 3
    Dernier message: 06/12/2009, 12h01
  3. [AJAX] Que se passe t'il quand une requête est envoyé ?
    Par whitespirit dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 31/07/2008, 08h28
  4. C'est quoi un Garbage collector ?
    Par Emilewawal dans le forum C#
    Réponses: 3
    Dernier message: 27/03/2008, 14h15
  5. [swing] quand le jtext field est vide
    Par Samanta dans le forum Débuter
    Réponses: 5
    Dernier message: 05/07/2005, 11h10

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