PDA

View Full Version : [JAVA] Thread sparito nel nulla (no exceptions)


tylerdurden83
11-02-2009, 10:56
Posto prima il codice:

long length = file.length();
while (true) {
if (length <= file.length()){
if ((line = input.readLine()) != null)
new myObject(line, dbM);
if (file.length() >= length)
length = file.length();
continue;
} else {
fs.close();
fileReader.close();
input.close();
file = new File(log);
fs = new FileInputStream(log);
fileReader = new InputStreamReader(fs);
input = new BufferedReader(fileReader);
length = file.length();
System.out.print("["+Utilities.getDate() + "] ");
System.out.println("["+Thread.currentThread().getName() + "] recreated [" +log+ "].");
}
try {
Thread.sleep(1000L);
//... if it's 2 am
System.out.print("["+Utilities.getDate() + "] ");
System.out.print("["+Thread.currentThread().getName() + "] ");
System.out.println("is alive.");
} catch (InterruptedException x) {
}
}


In pratica, all'avvio simulo un tail -f su un certo file, salvandomi le sue dimensioni allo startup. Il controllo sulla dimensione del file e il blocco else sono dovuti al fatto che a una certa ora del giorno, facciamo le 22, parte una cat/dev null sul file, e ho bisogno che il thread se ne accorga per ricreare lo stream e così via.

Una vulnerabilità sarebbe se la cat/dev null viene lanciata mentre il flusso di esecuzione è tra

if (file.length() >= length)

e

length = file.length();

ma se questo fosse il caso non mi troverei la System.out inclusa nel blocco try dato che il flusso entrerebbe in loop nell'if iniziale senza aver mai lanciato il blocco else.

Questa mattina, dopo che tutto ha funzionato senza problemi per un bel po', ho notato nel log che la System.out del blocco else era stata stampata, e la rotazione è andata a buon fine come sempre, tuttavia verso l'1 del mattino il thread si è apparentemente appeso, dato che non è più partita la System.out del blocco try.

myObject inserisce la linea letta in un DB, e farebbe crashare tutto se l'inserimento dovesse fallire (come è gia capitato per problemi di rete etc)

Cosa potrebbe essere successo al mio thread?

Ringrazio tutti come sempre,
TD

tylerdurden83
12-02-2009, 12:13
uppino...:muro:

Don[ITA]
12-02-2009, 12:18
Prova ad aggiungere la stampa quando catchi l'eccezione e vedi se ti stampa qualcosa oppure fa tutto come prima...

tylerdurden83
12-02-2009, 12:42
E' vero non ho copiato parte del codice per sintetizzare e non spaventare con un muro di codice, il resto è:


} catch (InterruptedException x) {
System.out.print(Utilities.getDate() + " ");
System.out.println(Thread.currentThread().getName() + " interrupted.");
x.printStackTrace();
Thread.currentThread().interrupt();
}
} // -> chiude il while(true)
} catch(Exception e){
System.out.print(Utilities.getDate() + " ");
System.out.println("Failure to run the run() method of "+Thread.currentThread().getName());
e.printStackTrace();
Thread.currentThread().interrupt();
}


Il primo catch è relativo al
try{
Thread.sleep()
}

il secondo al codice che sta prima del while(true) che ho postato sopra, ed è relativo all'apertura degli stream di lettura del file etc.

tylerdurden83
13-02-2009, 20:26
uppino x 2