InputStream reprend où il en était avant Exception
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:
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);
}
} |
Code:
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);
}
}
} |
La méthode read n'est pas celle réellement utilisée mais c'est pour l'exemple.
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.