Lors du débogage du démarrage lent d'une application Eclipse RCP sur un serveur Citrix, j'ai découvert que java.io.createTempFile (String, String, File) prenait 5 secondes. Il le fait seulement sur la première exécution et seulement pour certains comptes d'utilisateurs. Plus précisément, je remarque les comptes d'utilisateurs anonymes Citrix. Je n'ai pas essayé beaucoup d'autres types de comptes, mais ce comportement n'est pas exposé avec un compte d'administrateur.Pourquoi le premier appel à java.io.File.createTempFile (String, String, File) prend-il 5 secondes sur Citrix?
De plus, peu importe si l'utilisateur a accès ou non au répertoire donné. Si l'utilisateur n'a pas accès, l'appel prendra 5 secondes pour échouer. S'ils ont accès, l'appel prend 5 secondes pour réussir.
Ceci est sur un serveur Windows 2003. J'ai essayé les JRE 1.6.0_16 et 1.6.0_19 de Sun et j'ai observé le même comportement.
J'ai fait un peu de recherche sur Google, pensant que c'était un problème connu, mais je n'ai rien trouvé. Il semble que quelqu'un d'autre aurait dû y être confronté auparavant. La plate-forme Eclipse utilise File.createTempFile() pour tester divers répertoires pour voir s'ils sont inscriptibles pendant l'initialisation et ce problème ajoute 5 secondes au temps de démarrage de notre application.
J'imagine que quelqu'un a déjà été confronté à ce problème et pourrait avoir un aperçu. Voici un exemple de code que j'ai exécuté pour voir que c'est bien cet appel qui consomme le temps. J'ai également essayé avec un deuxième appel à createTempFile et notez que les appels suivants reviennent presque instantanément.
public static void main(final String[] args) throws IOException { final File directory = new File(args[0]); final long startTime = System.currentTimeMillis(); File file = null; try { file = File.createTempFile("prefix", "suffix", directory); System.out.println(file.getAbsolutePath()); } finally { System.out.println(System.currentTimeMillis() - startTime); if (file != null) { file.delete(); } } }
Exemple de sortie de ce programme est le suivant:
C:\>java.exe -jar filetest.jar C:/Temp C:\Temp\prefix8098550723198856667suffix 5093
Je tiens également à noter, 5 deuxième fois est cohérente. Je peux courir ceci encore et encore et cela prendra toujours entre 5000-5300 millisecondes. Je suppose que les 5 secondes doivent être un certain délai d'attente à un certain niveau. De plus, cela ne se passe pas seulement sur un serveur. A l'origine, le comportement a été remarqué sur un serveur mais j'ai mis en place un autre serveur et j'ai vu la même chose. –
Comme noté comme un commentaire sur l'une des réponses ci-dessous, j'ai remarqué que ce temps est réellement passé dans le premier appel de SecureRandom.nextLong(). En outre, j'ai constaté que ce problème se produit uniquement lorsqu'un utilisateur a le groupe "Invité" qui leur est associé. Je peux exécuter ce test avec un utilisateur et l'exécuter en moins de 100ms puis ré-exécuter le même test avec le même compte utilisateur après avoir simplement ajouté cet utilisateur au groupe "Invités" (sans supprimer aucune autre association de groupe de l'utilisateur avait dans la course précédente). –