Мы разрешаем пользователям загружать некоторые файлы изображений на наш веб-сервер. Эти файлы бесполезны через 10-15 минут после загрузки. Есть ли способ автоматически удалить эти файлы, например. все файлы изображений, срок действия которых истекает 15 минут после их создания?Как сделать домашнее хозяйство в причале?
ответ
Я в основном установки кварца планировщик в моем веб-сервер с хрон триггером
и работы выглядели более или как этот
public static void deleteFilesOlderThanNdays(int daysBack, String dirWay, org.apache.commons.logging.Log log) {
File directory = new File(dirWay);
if(directory.exists()){
File[] listFiles = directory.listFiles();
long purgeTime = System.currentTimeMillis() - (daysBack * 24 * 60 * 60 * 1000);
for(File listFile : listFiles) {
if(listFile.lastModified() < purgeTime) {
if(!listFile.delete()) {
System.err.println("Unable to delete file: " + listFile);
}
}
}
} else {
log.warn("Files were not deleted, directory " + dirWay + " does'nt exist!");
}
}
исх: http://www.coderanch.com/t/384581/java/java/Delete-Files-Older-days
Я не думаю, что у причала есть встроенная функция для этого. Вы можете создать своего рода класс GarbageCollector и запланировать удаление файла не используя ScheduledExecutorService:
public class GarbageCollector {
private ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
public void scheduleFileDeletion(Path path) {
service.schedule(() -> {
try {
Files.delete(path);
} catch (IOException ignored) {
}
}, 15, TimeUnit.MINUTES);
}
}
Там нет такого понятия в причалу, а mlapeyre говорит. Посмотрите на Guavas cache.
Нечто подобное будет делать трюк, я предполагаю:
Cache<Key, Graph> graphs = CacheBuilder.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.removalListener(DELETE_FILES_LISTENER)
.build();
Вы только что ответили на свой вопрос - получить все файлы со словом «истекают» в названии и модифицирована за 15 минут до текущего времени и удалить их ,
Вот код. Это не эффективно, но просто:
File dir=new File(".");
String []expiredFiles=dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return (name.contains("expired")&& new File(dir,name).lastModified()<System.currentTimeMillis()-15*60*1000);
}
});
for(String file:expiredFiles){
new File(dir,file).delete();
}
Вы можете запускать его каждые 15 минут или около того. Или, более простой подход, запустите его, когда каждый запрос отвечает и закрыт, но поток еще не остановлен. Например, когда сразу после закрытия потока вывода на объект ответа. Это не требует больших ресурсов, особенно когда поток работает и продолжает работать.
На самом деле вы должны запускать ее как каждую минуту :) Просто создайте 'ServletContextListener', который будет управлять жизненным циклом' ScheduledExecutorService' и планировать ваши очищать работу каждую минуту. –
Создать класс модели для хранения информации о загрузке изображения, например imagePath
и uploadedTime
.
class UploadedImage {
private Path imagePath;
private long uploadedTime;
public UploadedImage(Path imagePath, long uploadedTime) {
this.imagePath = imagePath;
this.uploadedTime = uploadedTime;
}
public Path getImagePath() {
return imagePath;
}
public long getUploadedTime() {
return uploadedTime;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final UploadedImage other = (UploadedImage) obj;
if (!Objects.equals(this.imagePath, other.imagePath)) {
return false;
}
if (this.uploadedTime != other.uploadedTime) {
return false;
}
return true;
}
}
Создание объекта UploadedImage для каждого образа-загрузки, и хранить их в глобальном ArrayList.
//...
ArrayList<UploadedImage> imageBucket = new ArrayList<>();
//...
public synchronized void uploadingImage(Path imagePath, long uploadedTime){
imageBucket.add(new UploadeImage(imagePath, uploadedTime));
}
И подготовить нить для удаления файлов, как показано ниже.
boolean deletionOff = false;
new Thread(new Runnable() {
private final long IMAGE_LIFE_TIME = 1000 * 60 * 15;//fifteen minutes
@Override
public void run() {
while (!deletionOff) {
//this fore-each will retrieve objects from OLDEST to NEWEST
for (UploadedImage uploadedImage : imageBucket) {
//finds the elapsed time since the upload of this image
long timeElapsed = System.currentTimeMillis() - uploadedImage.getUploadedTime();
if (timeElapsed >= IMAGE_LIFE_TIME) {
//following commands will execute only if the image is eligible to delete
try {
Files.delete(uploadedImage.getImagePath());
} catch (IOException ex) {
//
} finally {
imageBucket.remove(uploadedImage);
}
} else {
//this block will execute when IMAGE_LIFE_TIME is
//bigger than the elapsed time which means the
//selected image only have
//(IMAGE_LIFE_TIME - timeElapsed) of time to stay alive
//NOTE :
//there is no need to check the next UploadedImage
//objects as they were added to the list after the
//currently considering UploadedImage object,
//which is still has some time to stay alive
try {
Thread.sleep(IMAGE_LIFE_TIME - timeElapsed);
break;
} catch (InterruptedException ex) {
//
}
}
}
}
}
}).start();
- 1. Удаление прозрачных видов включает в себя любое домашнее хозяйство?
- 2. Что такое «домашнее хозяйство», которое должно быть сделано в приложении FXML?
- 3. Как разместить банки в причале/lib на причале classpath?
- 4. Как контролировать куски в причале?
- 5. несколько сервлетов в причале
- 6. Как управлять граалем в причале?
- 7. Попытка сделать домашнее приложение для замены?
- 8. Конфигурация перекрестного домена в причале
- 9. Как проверить подлинность клиента websocket в причале?
- 10. Невозможно скомпилировать сервлет в причале
- 11. развертывание оси2 на причале
- 12. Как закрыть домашнее окно
- 13. C++ домашнее задание, как
- 14. LoggingFilter игнорируется в Джерси и встроенном причале
- 15. Почему Urbanairship нужны ключи GCM? Как работает городское хозяйство?
- 16. Как запустить многомодовый проект maven на причале?
- 17. Внешняя конфигурация пружинной загрузки в автономном причале
- 18. двойная инициализация весенних бобах в причале 7.1.4
- 19. Как создать несколько событий веб-сокета в причале?
- 20. «org.apache.jasper.JasperException» при доступе к JSP в причале
- 21. Не удается найти сервлет в причале
- 22. Как получить стандартное домашнее приложение?
- 23. Basic Java домашнее задание
- 24. Списки - C (Домашнее задание)
- 25. метод в методе (домашнее задание)
- 26. Python Iteration Домашнее задание
- 27. Домашнее задание (ограничение единицы)
- 28. Как построить WebAppContext без файла web.xml в причале?
- 29. Как связать mx4j с ipaddress, а не localhost в причале?
- 30. Как использовать имена хостов вместо IP-адресов в причале?
почему бы не использовать кэш и храните байты изображения непосредственно в кеш. Установите время выселения/истечения времени записи (не доступ) 10-15 минут, и кеш автоматически позаботится об изображении. Любые поисковые запросы для изображения отвечают непосредственно из кеша (до тех пор, пока запись не истекла) –