2008-10-01 13 views
9

Mam plik tymczasowy z danymi, które są zwracane jako część odpowiedzi SOAP za pomocą binarnego załącznika MTOM. Chciałbym go wyrzucić, gdy tylko wywołanie metody "zakończy się" (tzn. Zakończy przesyłanie). Jaki jest najlepszy sposób, aby to zrobić? Najlepszym sposobem, aby dowiedzieć się, jak to zrobić, jest usunięcie ich, gdy sesja zostanie zniszczona, ale nie jestem pewien, czy jest to bardziej "natychmiastowy" sposób na zrobienie tego.Tomcat 6: jak usunąć pliki tymczasowe po zakończeniu połączenia z metodą WWW?

FYI, NIE używam Osi, używam jax-ws, jeśli to ma znaczenie.

AKTUALIZACJA: Nie jestem pewien, czy respondenci naprawdę rozumieją problem. Wiem, jak usunąć plik w języku Java. Mój problem jest następujący:

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

Odpowiedz

15

Wpadłem na ten sam problem. Problem polega na tym, że stos JAX-WS zarządza plikiem. Nie jest możliwe określenie w kodzie, kiedy JAX-WS jest wykonywany z plikiem, więc nie wiesz, kiedy go usunąć.

W moim przypadku używam DataHandler w moim modelu obiektu, a nie pliku. MyFileResult miałoby następujące pola zamiast polu Plik:

private DataHandler handler; 

Moje rozwiązanie było utworzyć niestandardową wersję FileDataSource. Zamiast zwracania FileInputStream odczytać zawartość pliku, wracam następujące rozszerzenia FileInputStream:

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

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

Zasadniczo źródła danych umożliwia odczyt tylko raz. Po zamknięciu strumienia plik zostanie usunięty. Ponieważ stos JAX-WS odczytuje plik tylko raz, działa.

Rozwiązanie jest nieco hack, ale wydaje się być najlepszym rozwiązaniem w tym przypadku.

+0

Podoba mi się to rozwiązanie! Moim celem było dodanie pliku do zmiennej sesji, a następnie usunięcie pliku po wygaśnięciu sesji użytkownika. Wprowadziłem również dodatkową kontrolę, aby usunąć plik w finalizacji(). –

0

Czy używasz standardowych plików tymczasowych Java? Jeśli tak, możesz to zrobić:

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

Przepraszam, może powinienem być bardziej konkretny. W którym momencie mogę usunąć plik? Nie mogę bezpośrednio w mojej funkcji adnotacji @WebMethod, ponieważ metoda sieciowa nie została jeszcze zwrócona. –

0

folder roboczy skonfigurowany w kontekście tej aplikacji internetowej, o której mówisz. Czy możesz ustawić ten katalog roboczy w znanym katalogu? Jeśli tak, to możesz znaleźć plik tymczasowy w katalogu roboczym temp (który znasz). Po znalezieniu możesz go usunąć.