Tomcat 6: come eliminare i file temporanei dopo che una chiamata al metodo web è terminata?

StackOverflow https://stackoverflow.com/questions/158568

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;
 }
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top