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;
 }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
9
0
10 682
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

Извините, возможно, мне следовало быть более конкретным. В какой момент я могу удалить файл? Я не могу напрямую использовать аннотированную функцию @WebMethod, потому что ответ веб-метода еще не возвращен.

Jen A 01.10.2008 20:50

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

Ответ принят как подходящий

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

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

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

Jen A 19.09.2009 01:00

Другие вопросы по теме