2014-12-16 2 views
0

Веб-приложение запускается на сервере tomcat, создает временные файлы и удаляет его после его использования, но некоторые временные файлы сценариев ошибок не удаляются. которые сложены и никогда не удаляются. Использованный deleteOnExit() кажется неработоспособным, после выключения сервера tomcat эти временные файлы все еще остаются в системе.удаление временных файлов onexit java vm

Ошибка в файлах, которые не были удалены, выглядит так, как будто какой-то процесс по-прежнему содержит блокировку, поэтому планируем написать класс потока/планировщика, который ставит в очередь все эти файлы ошибок и повторно пытается до тех пор, пока они не будут успешно удалены из системы.

ShutdownHook похож на мою мысль, но единственный недостаток, который я вижу, он работает только при выключении, это их лучшие методы, доступные для этой проблемы. Какие-либо предложения.

+0

Что такое операционная система? В UNIX-подобной системе удаление файла однажды должно заставить его исчезнуть, как только последний процесс завершит его. – 5gon12eder

+0

Операционные системы Windows – JAVAC

+0

Вы пытались проверить, какой процесс хранит блокировку этих файлов? –

ответ

1

Вы не хотите использовать File.deleteOnExit(): ваш веб-приложение должно работать в течение нескольких месяцев, не выходя из виртуальной машины Java, верно? Вместо этого вам необходимо самостоятельно очистить себя.

Используйте File.delete() и проверьте статус возврата (он возвращает boolean: проверьте его). Если это вернет false, выясните, почему это происходит. Например, если вы работаете в Windows, существуют некоторые (IMO глупые) ограничения на удаление файлов, открытых в реальном времени, включая процесс, пытающийся их удалить. Итак, если у вас есть другой поток, который имеет дескриптор файла для файла, который вы пытаетесь удалить, вы не сможете удалить файл.

Итак, что удерживает-открытым этот файл блокировки? Найдите это и исправьте. В частности, убедитесь, что вы правильно закрыли все свои файлы (вы использовали блоки finally? Если нет, вы делаете это неправильно) и что вы не пытаетесь сделать что-то глупое, как динамически - сгенерировать файл, сохранить на диск, попробуйте Tomcat, используя DefaultServlet, а затем удалите файл.

Если вы не можете заставить операцию удаления файлов работать синхронно, возможно, попробуйте асинхронное удаление: сохраните очередь файлов для удаления (возможно, в области application) и обработайте их каждые несколько минут. Просто попробуйте удалить каждый из них и, если удаление удастся, удалите его из очереди. Если очередь превышает некоторый размер, автоматически отправляйте электронное письмо администратору, чтобы жаловаться на размер очереди.

+0

@schultz - File.deleteOnExit() Я использовал его, не работал, как вам грустно перезапустить сервер длинные интервалы мин 60 дней, поэтому я придерживаюсь идеи, используя Queue для обработки этих файлов – JAVAC

0

Вы пытались выполнить шаги в одном и том же веб-приложении?
- Прочитать существующие файлы в папке temp
- Удалить все файлы (если они есть), которые были созданы ранее.
- Теперь начните материал, который создает новые временные файлы

+0

местоположение файла temp такое же, как и в исходном местоположении исходного файла, поэтому я не могу этого сделать, если мне не нужно выбирать, что временная папка tomcat имеет мой файл временного файла – JAVAC