Bonjour,
Je cherche à télécharger des fichiers CSV assez long depuis une requête HTTP.
Tout marche bien la plupart du temps. De manière sporadique (un fichier sur 15 environ) j'obtiens une exception "java.net.SocketException: Connection reset".
Je pense (mais je peux me tromper) que cette exception est "normale" et provient d'une erreur ou d'un temps de réponse trop long coté serveur. (Le serveur est un petit dataLogger et il faut compter plusieurs secondes pour récupérer un fichier d'une centaine de KO).
J'ai donc décidé d'attraper l'exception et de relancer le téléchargement après une seconde d'attente.
Ceci fonctionne, SAUF QUE : La deuxième fois que je tente de télécharger le fichier, je me retrouve uniquement avec la partie que je n'ai pas pu récupérer la première fois.
Pour résumé :
- Je tente de récupérer le fichier X
- Je récupère 1000 lignes
- Une "connection reset" survient
- Je ré-entre dans la méthode une seconde plus tard
- Je récupère les lignes de 1001 à 3000
Voici un bout de code de ce que je fais :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 private List<String> readLines(String fileName, InetAddress addr) throws IOException, IOReadLogException { HttpURLConnection con = this.getUrlGenerator().openConnnection(fileName, addr); // Génnère un nouveau HttpURLConnection à chaque appel con.connect(); try (InputStream inputStream = con.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream); BufferedReader buffer = new BufferedReader(inputStreamReader)) { return buffer.lines().collect(Collectors.toList()); }catch(UncheckedIOException e) { throw new IOException(e); } }La méthode read n'est pas celle réellement utilisée mais c'est pour l'exemple.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 private List<String> read() { while(true) { try { return this.readLines(fileName, addr); }catch (IOException e) { Thread.sleep(1000); } } }
Je ne comprend pas pourquoi - quand je rentre pour la deuxième fois dans la méthode readLines - le téléchargement reprend là où il s'était arrêté la première fois et de quelle manière je peux m'assurer d'avoir tout récupéré.
Après je peux toujours sauvegarder le premier résultat en bdd, le récupérer lors de la deuxième tentative... mais c'est contourner le problème et je n'ai pas de garantie qu'il n'y ai pas eu de doublon ou de données manquantes.
Partager