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

У меня есть временный файл с данными, которые возвращаются как часть ответа 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;
 }
}

person Jen A    schedule 01.10.2008    source источник


Ответы (3)


Я столкнулся с этой же проблемой. Проблема в том, что стек 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 считывает файл только один раз, он работает.

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

person Chris Dail    schedule 11.06.2009
comment
Мне нравится это решение! Мой хак заключался в том, чтобы добавить файл в переменную сеанса, а затем удалить файл, когда сеанс пользователя истек. Я также добавил дополнительную проверку на удаление файла в finalize(). - person Jen A; 19.09.2009

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

File script = File.createTempFile("temp", ".tmp", new File("./"));
... use the file ...
script.delete(); // delete when done.
person Steven M. Cherry    schedule 01.10.2008
comment
Извините, может быть, я должен был быть более конкретным. В какой момент я могу удалить файл? Я не могу напрямую использовать аннотированную функцию @WebMethod, потому что ответ веб-метода еще не возвращен. - person Jen A; 01.10.2008

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

person anjanb    schedule 01.10.2008