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

StackOverflow https://stackoverflow.com/questions/158568

Вопрос

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

Решение

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top