Spring

Spring Boot 스케줄러 @Scheduled 어노테이션 사용

주피터0410 2023. 10. 27. 10:09

※ 1분마다 실행하여 특정폴더의 1분전 화일 삭제하기

 

@SpringBootApplication에 @EnableScheduling 선언
@EnableScheduling
@SpringBootApplication
public class DevApplication {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        objectMapper.registerModule(module);
        return objectMapper;
    }

    public static void main(String[] args) {
        SpringApplication.run(DevApplication.class, args);
    }

}

 

@Scheduled > fixedDelay 사용
package com.coforward.dev.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import java.io.File;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

@Service
public class SchedulerService {

    @Value("${file.data}")
    private String dataFolder;

    // 1분전 화일 삭제
    @Scheduled(fixedDelay = 100000) // 1분마다 실행
    public void run() {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(int i=1; i<=3; i++) {
            String path = dataFolder.replace("file:///", "") + "channel"+i;
            File folder = new File(path);
            try {
                File[] folder_list = folder.listFiles(); //파일리스트 얻어오기
                System.out.println("folder_list.length >>>>>>>" + folder_list.length);
                for (int j = 0; j < folder_list.length; j++) {

                    File files = new File(String.valueOf(folder_list[j]));

                    String date = String.valueOf(sdf.format(files.lastModified())).replaceAll("[^0-9]", "");

                    int reg_year = Integer.parseInt(date.substring(0, 4));
                    int reg_month = Integer.parseInt(date.substring(4, 6));
                    int reg_day = Integer.parseInt(date.substring(6, 8));
                    int reg_hour = Integer.parseInt(date.substring(8, 10));
                    int reg_min = Integer.parseInt(date.substring(10, 12));
                    int reg_sec = Integer.parseInt(date.substring(12, 14));

                    // 현재 날짜
                    LocalDate now = LocalDate.now();

                    // 현재 시간
                    LocalTime time = LocalTime.now();

                    LocalDateTime startDateTime = LocalDateTime.of(reg_year, reg_month, reg_day, reg_hour, reg_min, reg_sec);
                    LocalDateTime endDateTime = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth(), time.getHour(), time.getMinute(), time.getSecond());

                    Duration duration = Duration.between(startDateTime, endDateTime);
					
                    // .ts 확장자를 duration.getSeconds() 60초 이상 화일들 삭제
                    if (String.valueOf(folder_list[j]).contains(".ts") == true && duration.getSeconds() > 60) {
                        System.out.println("60초 이후 화일 삭제 ==>> " + folder_list[j] + " -- " + sdf.format(files.lastModified()) + " -- " + duration.getSeconds());
                        folder_list[j].delete(); //파일 삭제
                    }
                }
            } catch (Exception e) {
                e.getStackTrace();
            }
        }
    }
}