1. 개요
5에서 사용자에게 보여줄 웹 페이지를 만들었다면, 이번에는 주기적으로 사용자를 대기에서 입장 가능 상태로 전환해 주는 스케줄러를 개발한다. @EnableScheduling 애노테이션을 사용하며, 이 애노테이션은 스프링 프레임워크에서 스케줄링 기능을 활성화하기 위해 사용된다. @Scheduled 애노테이션을 통해 특정 메서드를 주기적으로 실행하도록 설정할 수 있다.
2. application.properties
scheduler.enabled=true
단, 테스트 코드 쪽 설정에는 스케줄러가 돌지 않도록 false로 설정한다.
3. @EnableScheduling 추가
SchedulingConfig
package me.progfrog.idol.flow.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@Configuration
public class SchedulingConfig {
}
4. @Scheduled 추가
UserQueueService
private final String USER_QUEUE_WAIT_KEY_FOR_SCAN = "users:queue:*:wait";
@Value("${scheduler.enabled}")
private Boolean scheduling = false;
/**
* 스케줄러
*/
@Scheduled(initialDelay = 5000, fixedDelay = 3000)
public void scheduleAllowUser() {
if (!scheduling) {
log.info("passed scheduling");
return;
}
log.info("called scheduling...");
// 대기 큐가 여러 개 있는 상황을 고려해서, 사용자를 대기에서 입장 가능 상태로 전환하도록 코드 작성
var maxAllowUserCount = 3L;
reactiveRedisTemplate.scan(
ScanOptions
.scanOptions()
.match(USER_QUEUE_WAIT_KEY_FOR_SCAN)
.build())
.map(key -> key.split(":")[2])
.flatMap(queue -> allowUser(queue, maxAllowUserCount)
.map(isAllowed -> Tuples.of(queue, isAllowed)))
.doOnNext(tuple -> log.info("Tried %d and allowed %d members of %s queue".formatted(maxAllowUserCount,
tuple.getT2(),
tuple.getT1())))
.subscribe();
}
5. 동작 확인
애플리케이션이 시작한 뒤 5초 뒤(initialDelay = 5000)에 3초 간격(fixedDelay = 3000)으로 스케줄러가 호출되는 부분 확인
반응형