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;
}
}
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 читает файл только один раз, он работает.
Решение немного хакерское, но в данном случае кажется лучшим вариантом.
Рабочая папка, которую вы настроили в контексте этого веб-приложения, о котором вы говорите. Можете ли вы установить этот рабочий каталог в известном каталоге? Если да, то вы можете найти временный файл во временном рабочем каталоге (что вы знаете). Как только вы найдете, вы можете удалить его.
Вы используете стандартные временные файлы Java? Если это так, вы можете сделать это:
File script = File.createTempFile("temp", ".tmp", new File("./"));
... use the file ...
script.delete(); // delete when done.