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




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