2008-10-01 5 views
9

Ich habe eine temporäre Datei mit Daten, die als Teil einer SOAP-Antwort über eine MTOM binäre Anlage zurückgegeben wird. Ich würde es gerne löschen, sobald der Methodenaufruf "beendet" (d. H. Die Übertragung beendet). Was ist der beste Weg für mich, dies zu tun? Der beste Weg, wie ich das herausfinden kann, ist, sie zu löschen, wenn die Sitzung zerstört wird, aber ich bin mir nicht sicher, ob es einen "unmittelbaren" Weg gibt, dies zu tun.Tomcat 6: Wie lösche ich temporäre Dateien, nachdem ein Web-Methoden-Aufruf beendet wurde?

FYI, ich benutze nicht Axis, ich benutze Jax-Ws, wenn das wichtig ist.

UPDATE: Ich bin mir nicht sicher, ob die Antworter wirklich das Problem verstehen. Ich weiß, wie man eine Datei in Java löscht. Mein Problem ist das:

@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; 
} 
} 

Antwort

15

Ich stieß auf das gleiche Problem. Das Problem besteht darin, dass der JAX-WS-Stapel die Datei verwaltet. Es ist nicht möglich, in Ihrem Code zu bestimmen, wann JAX-WS mit der Datei fertig ist, sodass Sie nicht wissen, wann Sie sie löschen müssen.

In meinem Fall verwende ich einen DataHandler für mein Objektmodell und nicht für eine Datei. MyFileResult hätte das folgende Feld anstelle eines Dateifeld:

private DataHandler handler; 

Meine Lösung eine angepasste Version von FileDataSource zu schaffen. Statt ein Fileinputstream der Rücksendung der Inhalt der Datei zu lesen, kehre ich die folgende Erweiterung von Fileinputstream:

private class TemporaryFileInputStream extends FileInputStream { 
    public TemporaryFileInputStream(File file) throws FileNotFoundException { 
     super(file); 
    } 

    @Override 
    public void close() throws IOException { 
     super.close(); 
     file.delete(); 
    } 
} 

Wesentlichen die Datenquelle nur einmal das Lesen ermöglicht. Nachdem der Stream geschlossen wurde, wird die Datei gelöscht. Da der JAX-WS-Stack die Datei nur einmal liest, funktioniert sie.

Die Lösung ist ein bisschen wie ein Hack, scheint aber in diesem Fall die beste Option zu sein.

+0

Ich mag diese Lösung! Mein Hack war, die Datei zu einer Sitzungsvariablen hinzuzufügen und dann die Datei zu löschen, wenn die Benutzersitzung abgelaufen ist. Ich habe auch einen zusätzlichen Check hinzugefügt, um die Datei in finalize() zu löschen. –

0

Verwenden Sie Standard-Java-Temp-Dateien? Wenn ja, können Sie Folgendes tun:

File script = File.createTempFile("temp", ".tmp", new File("./")); 
... use the file ... 
script.delete(); // delete when done. 
+0

Sorry, vielleicht hätte ich genauer sein sollen. An welchem ​​Punkt kann ich die Datei löschen? Ich kann nicht direkt in meiner annotierten Funktion @WebMethod, da die Antwort der Webmethode noch nicht zurückgegeben wurde. –

0

der Arbeitsordner, den Sie im Kontext für diese Webanwendung eingerichtet haben, von der Sie sprechen. Können Sie dieses Arbeitsverzeichnis in einem bekannten Verzeichnis festlegen? Wenn ja, dann können Sie die Temp-Datei im Temp-Arbeitsverzeichnis (das Sie kennen) finden. Sobald Sie gefunden haben, können Sie es löschen.

Verwandte Themen