[Spring] Scheduling - CronTask
- study
- 2021. 10. 2. 16:04
@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일에 수행
- 10W
- # - 몇주 째인지 찾는다. - 요일에서만 사용가능
- 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);
}
}
'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 |