Томкэт 6:как удалить временные файлы после завершения вызова веб-метода?
-
03-07-2019 - |
Вопрос
У меня есть временный файл с данными, который возвращается как часть ответа 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.
рабочая папка, которую вы настроили в контексте этого веб-приложения, о котором вы говорите.Можете ли вы установить этот рабочий каталог в известном каталоге?Если да, то вы можете найти временный файл во временном рабочем каталоге (который вам известен).Как только найдете, можете удалить.