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".
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.
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); }
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:
avec ih un InvocationHandler qui communique avec le réseau.
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;
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.
Partager