Tomcat 6: come eliminare i file temporanei dopo che una chiamata al metodo web è terminata?
-
03-07-2019 - |
Domanda
Ho un file temporaneo con i dati restituiti come parte di una risposta SOAP tramite un allegato binario MTOM. Vorrei eliminarlo non appena il metodo chiama " termina " (ad esempio, termina il trasferimento). Qual è il modo migliore per farlo? Il modo migliore in cui riesco a capire come farlo è quello di eliminarli quando la sessione viene distrutta, ma non sono sicuro che ci sia un modo più "immediato" per farlo.
Cordiali saluti, NON sto usando Axis, sto usando jax-ws, se questo è importante.
AGGIORNAMENTO: non sono sicuro che i rispondenti stiano davvero capendo il problema. So come eliminare un file in Java. Il mio problema è questo:
@javax.jws.WebService
public class MyWebService {
...
@javax.jws.WebMethod
public MyFileResult getSomeObject() {
File mytempfile = new File("tempfile.txt");
MyFileResult result = new MyFileResult();
result.setFile(mytempfile); // sets mytempfile as MTOM attachment
// mytempfile.delete() iS WRONG
// can't delete mytempfile because it hasn't been returned to the web service client
// yet. So how do I remove it?
return result;
}
}
Soluzione
Ho riscontrato questo stesso problema. Il problema è che lo stack JAX-WS gestisce il file. Non è possibile determinare nel codice quando JAX-WS ha terminato il file, quindi non si sa quando eliminarlo.
Nel mio caso, sto usando un DataHandler sul mio modello a oggetti piuttosto che un file. MyFileResult avrebbe il seguente campo invece di un campo file:
private DataHandler handler;
La mia soluzione era quella di creare una versione personalizzata di FileDataSource. Invece di restituire un FileInputStream per leggere il contenuto del file, restituisco la seguente estensione di FileInputStream:
private class TemporaryFileInputStream extends FileInputStream {
public TemporaryFileInputStream(File file) throws FileNotFoundException {
super(file);
}
@Override
public void close() throws IOException {
super.close();
file.delete();
}
}
Essenzialmente l'origine dati consente la lettura una sola volta. Dopo la chiusura dello stream, il file viene eliminato. Poiché lo stack JAX-WS legge il file solo una volta, funziona.
La soluzione è un po 'un trucco ma sembra essere l'opzione migliore in questo caso.
Altri suggerimenti
Stai usando i file java temp standard? In tal caso, puoi farlo:
File script = File.createTempFile("temp", ".tmp", new File("./"));
... use the file ...
script.delete(); // delete when done.
la cartella di lavoro che hai impostato nel contesto di questa webapp di cui stai parlando. È possibile impostare questa directory di lavoro in una directory nota? Se sì, allora puoi trovare il file temporaneo nella directory di lavoro temporanea (che conosci). Una volta trovato, puoi eliminarlo.