본문으로 바로가기
반응형

Spring 스케쥴러를 이용한 파일 삭제 (수정한 날짜 기준 데이터 삭제)



프로그래밍을 하다보면 가비지(Garbage) 파일에 대한 처리를 해야 할 때가 발생하곤 합니다.

때로는 가비지(Garbage) 파일이 생기지 않도록 설계를 하는 것이 좋은 방법이긴 하지만, 상황에 따라 발생하게 되는 경우가 종종 생깁니다.

이때 필요한 방법 중 한가지를 소개 하려고 합니다.

다음과 같은 전재 조건이 발생 한다면, 좋은 참고 자료가 될 것 같습니다.
(가비지(Garbage)파일이 수정한 날짜 기준으로 7200초(2시간)가 지난 파일은 삭제 처리를 해야 한다.)


삭제 처리 방식
1. spring 스케쥴링을 이용하여 1시간 간격으로 파일 모니터링
2. 파일의 수정한 날짜가 2시간이 경과한 경우 삭제 처리


import java.io.File;

import java.io.IOException;

import java.nio.file.Files;

import java.nio.file.Path;

import java.nio.file.attribute.BasicFileAttributes;

import java.util.concurrent.TimeUnit;


import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Service;


import com.xcurenet.prs.attach.service.StreamingFileUtil;


@Service

public class VideoFilesDelete {


private static final Logger log = LoggerFactory.getLogger(VideoFilesDelete.class);


private static final int DELETE_SEC = 7200;


@Scheduled(cron = "0 0 * * * ?") //1시간마다

public void userJob() throws Exception {

deleteFolders(DELETE_SEC);

}


public static void main(String[] args) {

deleteFolders(DELETE_SEC);

}


private static void deleteFolders(int sec) {

File video = new File(StreamingFileUtil.VIDEO_TMP);

if (!video.isDirectory()) return;


for (File adminDirs : video.listFiles()) {

File files[] = adminDirs.listFiles();

if (files == null) continue;

for (File f : files) {

try {

long fModify = getSecondsFromModification(f);

if (fModify > sec) {

log.info("temp file delete : " + f.getAbsolutePath() + "  modify time(s) : " + fModify);

f.delete();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

}


        // 파일의 수정한 날짜를 현재 시간 대비 경과 시간을 초로 환산 하여 리턴

private static long getSecondsFromModification(File f) throws IOException {

Path attribPath = f.toPath();

BasicFileAttributes basicAttribs = Files.readAttributes(attribPath, BasicFileAttributes.class);

return (System.currentTimeMillis() - basicAttribs.lastModifiedTime().to(TimeUnit.MILLISECONDS)) / 1000;

}

}





1. 스케쥴 등록

    - @Scheduled(cron = "0 0 * * * ?") //1시간마다


2. 디렉토리 내 파일의 수정한 날짜 경과 시간 검사

    - long fModify = getSecondsFromModification(f);

      if (fModify > sec) ...


3. 정해진 시간보다 파일의 수정한 날짜가 오래 되었다면 삭제 처리

    - f.delete();




* 궁금한 사항은 댓글을 달아 주시기 바랍니다.


반응형