본문 바로가기
🛠 BackEnd/Spring

[ Spring ] @Scheduled 스케줄러 사용법

by 깸뽀 2022. 11. 2.
728x90

💻 SchedulerConfig.class

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

// [Configuration 어노테이션 : 자바 클래스 파일을 설정 파일로 사용]
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
    private final int POOL_SIZE = 10;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        // [스레드 풀을 사용해서 모든 예약된 스케줄 작업이 실행되도록 설정]
        // [스프링에서는 스케줄링 작업은 한개의 스레드 풀에서 실행되기때문에 >> 다중 동시 실행을 위해서 스레드 풀 설정 실시]
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();

        threadPoolTaskScheduler.setPoolSize(POOL_SIZE);
        threadPoolTaskScheduler.setThreadNamePrefix("scheduled-task-pool-");
        threadPoolTaskScheduler.initialize();

        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
        System.out.println("\n");
        System.out.println("=======================================");
        System.out.println("current thread : " + Thread.currentThread().getName());
        System.out.println("=======================================");
        System.out.println("\n");
    }
}
 
 

 

💻 SchedulerService.class

import com.example.intermediate.repository.CommentRepository;
import com.example.intermediate.repository.PostRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

@Slf4j //로그
@RequiredArgsConstructor // final 멤버 변수를 자동으로 생성
@Component // 스프링이 필요 시 자동으로 생성하는 클래스 목록에 추가
public class SchedulerService {

    private final PostRepository postRepository;
    private final CommentRepository commentRepository;

    // 현재날짜 및 시간
    public String getNowDateTime24() {
        long time = System.currentTimeMillis();
        SimpleDateFormat dayTime = new SimpleDateFormat("yyyy.MM.dd kk:mm:ss E요일");
        String str = dayTime.format(new Date(time));

        return str;
    }

    // 초, 분, 시, 일, 월, 주 순서
    @Scheduled(cron = "0 00 01 * * *")
    public void selectPost() {
        System.out.println("[JopTime] : " + getNowDateTime24());
        System.out.println("게시글 조회");

        List<Post> postList = postRepository.findAll();

        for (Post post : postList) {
            if(commentRepository.findAllByPost(post).isEmpty()) {
                log.info("게시물 < " + post.getTitle() + " > 이 삭제되었습니다.");
                postRepository.deleteById(post.getId());
            }
        }
    }
}

 

 

 

💻 main.calss

@EnableScheduling // 스프링 부트에서 스케줄러가 작동
@EnableJpaAuditing
@SpringBootApplication
public class IntermediateApplication {

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

}
728x90

댓글