[Spring] Scheduling - CronTask

@EnableScheduling

  • Scheduling 관련 Bean들을 등록해 준다.
@Configuration
@EnableScheduling
public class ScheduledConfig {
}

 

 

@Scheduled

  • 메서드 위에 @Schedule 어노테이션을 붙혀 해당 로직을 스케줄링 할 수 있다.
@Scheduled(cron = "0 45 20 2 * *")
public String executeWithScheduled() {
    log.info("executeWithScheduled : 매달 2일 저녁 8시 45분");
    return "execute";
}

 

 

 

Cron표기법

요일 연도
0 ~ 59 0 ~ 59 0~23 1~31 1~12 0~6 생략가능

 

  • 요일의 경우 0이 일요일이며 6이 토요일이다.
  • * 는 모든 조건을 뜻한다.
  • ?는 설정값이 없을 때 쓰이며 일, 요일에서만 사용가능하다.
  • L - 마지막 - 일, 요일에서만 사용가능
  • W - 가장 가까운 평일을 찾는다. - 일 에서만 사용가능
    • 10W
      • 10일이 평일이면 : 10일에 수행
      • 10일이 토요일이면 : 가장 가운 평일인 금요일 9일에 수행
      • 10일이 일요일일때 가장 가까운 평일인 월요일 11일에 수행
  • # - 몇주 째인지 찾는다. - 요일에서만 사용가능
    • 3#2 : 2째주 수요일에 수행

 

테스트 하기

 

특정 시간에 스케줄을 걸고 동작하는지 테스트 하는 것은 너무 어렵다..ㅜ @Schedule를 걸면 ScheduleTaskHolder에 Task가 등록되는데, 이 Task에 설정된 값을 비교하는 식으로 테스트를 해야 할 것 같다. 

 

@SpringBootTest
class TestServiceTest {
    @Autowired
    private ScheduledTaskHolder scheduledTaskHolder;

    @Test
    public void testExecuteWithScheduled() {
        String methodName = TestService.class.getName() + ".executeWithScheduled";
        String cron =  "0 45 20 2 * *";

        long count = scheduledTaskHolder.getScheduledTasks().stream()
                .filter(scheduledTask -> scheduledTask.getTask() instanceof CronTask)
                .map(scheduledTask -> (CronTask) scheduledTask.getTask())
                .filter(cronTask -> cronTask.getExpression().equals(cron) && cronTask.toString().equals(methodName))
                .count();


        Assertions.assertThat(count).isEqualTo(1L);
    }
}
thank you for button

'study' 카테고리의 다른 글

[Spring]프로토타입과 스코프  (0) 2021.12.02
[DB]트랜잭션 정리  (0) 2021.12.02
[AWS] AWS에는 무슨 서비스가 있을까?  (0) 2021.07.20
[java]JVM JRE JDK  (0) 2021.06.17
내가 만난 CORS 관련 문제  (2) 2021.06.14

댓글



Designed by JB FACTORY