Frage

Ich habe eine temporäre Datei mit Daten, die als Teil einer SOAP-Antwort über eine MTOM binäre Anlage zurückgegeben. Ich möchte es in den Papierkorb, sobald die Methode aufrufen „Enden“ (das heißt, beendet die Übertragung). Was ist der beste Weg für mich, dies zu tun? Der beste Weg, kann ich herausfinden, wie dies zu tun ist, sie zu löschen, wenn die Sitzung zerstört wird, aber ich bin nicht sicher, ob es eine ‚sofortige‘ Art und Weise, dies zu tun.

FYI, ich bin nicht mit Axis, ich JAX-WS bin mit, wenn es ankommt.

UPDATE: Ich bin nicht sicher, dass die Beantworter wirklich das Problem sind zu verstehen. Ich weiß, wie eine Datei in Java zu löschen. 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);  // 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;
 }
}
War es hilfreich?

Lösung

Ich lief in das gleiche Problem. Das Problem ist, dass der JAX-WS-Stack die Datei verwaltet. Es ist nicht möglich, in Ihrem Code zu bestimmen, wann JAX-WS mit der Datei durchgeführt wird, so dass Sie nicht wissen, wann sie löschen.

In meinem Fall ich bin mit einem Datahandler auf meinem Objektmodell statt einer Datei. MyFileResult hätte folgende Feld anstelle eines Dateifeld:

private DataHandler handler;

Meine Lösung war eine angepasste Version von FileDataSource zu erstellen. Statt ein Fileinputstream die Rücksendung den 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();
    }
}

Im Wesentlichen ermöglicht die Datenquelle nur einmal zu lesen. Nachdem der Strom geschlossen wird, wird die Datei gelöscht. Da der JAX-WS-Stack nur einmal die Datei liest, funktioniert es.

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

Andere Tipps

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

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

die Arbeit Ordner, den Sie im Rahmen dieser Webapp einrichten, die Sie sprechen sind. Können Sie dieses Arbeitsverzeichnis in einem bekannten Verzeichnis festgelegt? Wenn ja, dann können Sie die temporäre Datei im temporären Arbeitsverzeichnis finden (die Sie kennen). Sobald Sie gefunden haben, können Sie es löschen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top