Bonjour,
Je rencontre un problème avec une application Eclipse RCP (mais je ne pense pas que cela ait un lien) s'exécutant en java 1.5 (je ne peux pas migrer en 1.7, mais c'est une autre histoire), sous Windows 8.
Dans cette application, on peut ouvrir des fichiers qui sont traités par des applications externes, non java (Adobe InDesign et Photoshop, pour ne pas les citer). Les fichiers sont téléchargés depuis un serveur (CMS) dans un dossier de travail local (situé dans le workspace de l'application), chaque fichier (accompagné d'autres fichiers) dans un dossier spécifique, puis l'application locale est lancée (comme c'est du java 1.5, avec un Runtime.exec.
Lorsque l'utilisateur sauvegarde dans l'application externe, un process de mon application prend la main sur la sauvegarde pour renvoyer le fichier au serveur. Ceci fait un traitement relativement complexe, puisque le document référence des données situés dans le CMS : il y a donc un traitement qui compare l'état du doc local par rapport au doc chargé, et qui va déterminer si on doit créer, mettre à jour, ou supprimer des contenus dans mon CMS, et quelles modifications apporter au document pour les prendre en compte (liens). Comme l'utilisateur peut sauver autant de fois qu'il veut, et en particulier pendant que je suis en train de traiter une sauvegarde demandée précédemment, je gère une file d'attente, sous forme de sous-dossiers : à chaque sauvegarde, je fais donc un snapshot du dossier courant vers un sous-dossier dans la file d'attente, ce qui me permet de le traiter tranquillement. Lorsque j'ai fini le traitement, je nettoie le sous-dossier : je supprime les fichiers qui s'y trouvent puis je le supprime et là je dois attendre 90 secondes pour que le dossier, vide, s'efface.
En debug, je vois que ces 90 secondes d'attente sont effectuées ici :
WinNTFileSystem.delete0(File) line: not available [native method] [local variables unavailable]
WinNTFileSystem(Win32FileSystem).delete(File) line: 504
File.delete() line: 871
J'ai tenté de faire un rename() également et c'est pareil. Si je kill mon application java pendant le delete(), et que je tente de supprimer mon dossier via l'explorateur windows, c'est pareil. Mais si je ferme mon application avant l'invocation de File.delete(), aucun problème. Si je ferme mon application, et que je la relance, et que je fais un File.delete(), rebelote, 90 secondes d'attente (voir le paragraphe ci-après). Du coup, j'ai du mal à déterminer si le problème vient de java, de windows, de l'utilisation d'un vieux java obsolète avec un windows super récent (genre un effet d'un changement bas niveau dans le traitement des fichiers).
Je pourrais paralléliser mon traitement d'effacement à la sauvegarde pour éviter de bloquer la sauvegarde, mais j'ai un problème technique pas simple à gérer dans ce cas, car je fais de la reprise à froid (si une des applications plantent, et qu'on redémarre, on retrouve un système stable interconnecté (en particulier la palette flottante) : le problème, c'est que lors des traitements de reprise je suis obligé de supprimer certains dossiers avant de rendre disponible la palette, et il arrive donc que cette dernier ne puisse être disponible qu'au bout de 90 secondes (minimum) après le redémarrage de l'application.
A noter, que lorsque je teste sous Eclipse, le problème est systématique, alors qu'il est plus rare, lorsque l'application est exécutée buildée.
J'ai soupçonné au début que c'était windows 8.1 et mon SSD qui posaient problèmes, mais le problème arrive également en production sur des postes windows 7, en disque classique : simplement, ça arrive beaucoup moins souvent, ou seulement lorsque les applications sont fermées dans des états particuliers (comme par exemple, si on laisse une image ouverte dans photoshop, qu'on ferme photoshop, puis qu'on relance l'appli java). J'ai même désactivé l'indexation windows, au cas où (parce que j'avais remarqué avec les outils de sysinternals que l'indexeur windows accédait sans arrêt à mon dossier).
Aucun problème sur XP, ou encore sur MacOSX.
Merci par avance de toute idée qui me permettrait d'avancer, parce que j'ai épuisé toutes celles que j'avais pour analyser, corriger ou contourner le problème.
Partager