Tomcat 6: как удалить временные файлы после завершения вызова веб-метода? - PullRequest
9 голосов
/ 01 октября 2008

У меня есть временный файл с данными, который возвращается как часть ответа SOAP через двоичное вложение MTOM. Я хотел бы удалить его, как только вызов метода «заканчивается» (т.е. завершается передача). Какой лучший способ для меня это сделать? Лучший способ выяснить, как это сделать, - это удалить их, когда сеанс уничтожен, но я не уверен, есть ли более «немедленный» способ сделать это.

К вашему сведению, я НЕ использую Axis, я использую jax-ws, если это имеет значение.

ОБНОВЛЕНИЕ: я не уверен, что ответчики действительно понимают проблему. Я знаю, как удалить файл в Java. Моя проблема заключается в следующем:

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

Ответы [ 3 ]

15 голосов
/ 11 июня 2009

Я столкнулся с этой же проблемой. Проблема заключается в том, что стек JAX-WS управляет файлом. Невозможно определить в вашем коде, когда JAX-WS выполняется с файлом, поэтому вы не знаете, когда его удалить.

В моем случае я использую DataHandler в моей объектной модели, а не в файле. MyFileResult будет иметь следующее поле вместо поля файла:

private DataHandler handler;

Мое решение состояло в том, чтобы создать настроенную версию FileDataSource. Вместо того, чтобы возвращать FileInputStream для чтения содержимого файла, я возвращаю следующее расширение FileInputStream:

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

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

По сути, источник данных позволяет читать только один раз. После закрытия потока файл удаляется. Поскольку стек JAX-WS читает файл только один раз, он работает.

Решение немного взломано, но в данном случае кажется лучшим вариантом.

0 голосов
/ 02 октября 2008

рабочая папка, которую вы настроили в контексте этого веб-приложения, о котором вы говорите. Можете ли вы установить этот рабочий каталог в известном каталоге? Если да, то вы можете найти временный файл во временном рабочем каталоге (что вы знаете). Как только вы найдете, вы можете удалить его.

0 голосов
/ 01 октября 2008

Используете ли вы стандартные временные файлы Java? Если это так, вы можете сделать это:

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