2015-05-26 2 views
6

Мы разрешаем пользователям загружать некоторые файлы изображений на наш веб-сервер. Эти файлы бесполезны через 10-15 минут после загрузки. Есть ли способ автоматически удалить эти файлы, например. все файлы изображений, срок действия которых истекает 15 минут после их создания?Как сделать домашнее хозяйство в причале?

+2

почему бы не использовать кэш и храните байты изображения непосредственно в кеш. Установите время выселения/истечения времени записи (не доступ) 10-15 минут, и кеш автоматически позаботится об изображении. Любые поисковые запросы для изображения отвечают непосредственно из кеша (до тех пор, пока запись не истекла) –

ответ

0

Я в основном установки кварца планировщик в моем веб-сервер с хрон триггером

и работы выглядели более или как этот

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

0

Я не думаю, что у причала есть встроенная функция для этого. Вы можете создать своего рода класс 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); 
    } 
} 
2

Там нет такого понятия в причалу, а mlapeyre говорит. Посмотрите на Guavas cache.

Нечто подобное будет делать трюк, я предполагаю:

Cache<Key, Graph> graphs = CacheBuilder.newBuilder() 
     .maximumSize(1000) 
     .expireAfterWrite(10, TimeUnit.MINUTES) 
     .removalListener(DELETE_FILES_LISTENER) 
     .build(); 
6

Вы только что ответили на свой вопрос - получить все файлы со словом «истекают» в названии и модифицирована за 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 минут или около того. Или, более простой подход, запустите его, когда каждый запрос отвечает и закрыт, но поток еще не остановлен. Например, когда сразу после закрытия потока вывода на объект ответа. Это не требует больших ресурсов, особенно когда поток работает и продолжает работать.

+0

На самом деле вы должны запускать ее как каждую минуту :) Просто создайте 'ServletContextListener', который будет управлять жизненным циклом' ScheduledExecutorService' и планировать ваши очищать работу каждую минуту. –

0

Создать класс модели для хранения информации о загрузке изображения, например 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(); 
Смежные вопросы