10 Stimmen

Tomcat 6: wie werden temporäre Dateien nach dem Ende eines Webmethoden-Aufrufs gelöscht?

Ich habe eine temporäre Datei mit Daten, die als Teil einer SOAP-Antwort über einen MTOM-Binärdateianhang zurückgegeben wird. Ich möchte sie gerne löschen, sobald der Methodenaufruf "endet" (d.h., der Transfer abgeschlossen ist). Wie kann ich das am besten tun? Der beste Weg, den ich herausfinden kann, ist, sie zu löschen, wenn die Sitzung beendet wird, aber ich bin mir nicht sicher, ob es eine 'direktere' Möglichkeit gibt, das zu tun.

FYI, ich verwende kein Axis, sondern jax-ws, falls das eine Rolle spielt.

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

@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);  // setzt mytempfile als MTOM-Anhang

   // mytempfile.delete() IST FALSCH
   // kann mytempfile nicht löschen, da es noch nicht an den Web-Service-Client zurückgegeben wurde
   // also wie kann ich es entfernen?

   return result;
 }
}

16voto

Chris Dail Punkte 24971

Ich bin auf dasselbe Problem gestoßen. Die Ursache ist, dass der JAX-WS-Stack die Datei verwaltet. Es ist nicht möglich in Ihrem Code festzustellen, wann JAX-WS mit der Datei fertig ist, sodass Sie nicht wissen, wann Sie sie löschen können.

In meinem Fall verwende ich ein DataHandler-Objektmodell anstelle einer Datei. Mein MyFileResult würde das folgende Feld anstelle eines Dateifeldes haben:

private DataHandler handler;

Meine Lösung bestand darin, eine angepasste Version von FileDataSource zu erstellen. Anstelle eines FileInputStream zum Lesen des Dateiinhalts gebe ich die folgende Erweiterung von FileInputStream zurück:

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

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

Im Wesentlichen ermöglicht der Datenquelle nur einmaliges Lesen. Nachdem der Stream geschlossen ist, wird die Datei gelöscht. Da der JAX-WS-Stack die Datei nur einmal liest, funktioniert es.

Die Lösung ist ein bisschen schlampig, erscheint jedoch als die beste Option in diesem Fall.

0 Stimmen

Ich mag diese Lösung! Mein Hack bestand darin, die Datei einer Session-Variablen hinzuzufügen und die Datei dann zu löschen, wenn die Sitzung des Benutzers abgelaufen ist. Außerdem habe ich eine zusätzliche Überprüfung eingefügt, um die Datei in finalize() zu löschen.

0voto

Steven M. Cherry Punkte 1335

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

File script = File.createTempFile("temp", ".tmp", new File("./"));
... die Datei verwenden ...
script.delete(); // löschen, wenn fertig.

0 Stimmen

Entschuldigung, vielleicht hätte ich konkreter sein sollen. An welcher Stelle kann ich die Datei löschen? Ich kann es nicht direkt in meiner mit @WebMethod annotierten Funktion tun, da die Antwort des Webmethods noch nicht zurückgegeben wurde.

0voto

anjanb Punkte 12084

Der Arbeitsordner, den Sie im Kontext für diese Web-App eingerichtet haben, über den Sie sprechen. Können Sie diesen Arbeitsordner in einem bekannten Verzeichnis einrichten? Wenn ja, können Sie die Temporäre Datei im temporären Arbeitsverzeichnis (das Sie kennen) finden. Sobald Sie sie gefunden haben, können Sie sie löschen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X