EJB 타이머 대 Jakarta 스케줄러
ManagedScheduledExecutorService로 무거운 EJB 타이머를 대체합니다.
코드 비교
✕ Java EE
@Stateless
public class ReportGenerator {
@Resource
TimerService timerService;
@PostConstruct
public void init() {
timerService.createCalendarTimer(
new ScheduleExpression()
.hour("2").minute("0"));
}
@Timeout
public void generateReport(Timer timer) {
// runs every day at 02:00
buildDailyReport();
}
}
✓ Jakarta EE 10+
@ApplicationScoped
public class ReportGenerator {
@Resource
ManagedScheduledExecutorService scheduler;
@PostConstruct
public void init() {
scheduler.scheduleAtFixedRate(
this::generateReport,
0, 24, TimeUnit.HOURS);
}
public void generateReport() {
buildDailyReport();
}
}
이 코드에 문제가 있나요? 알려주세요.
모던 방식이 더 나은 이유
보일러플레이트 감소
@Timeout 콜백이나 ScheduleExpression이 없습니다 — 표준 ScheduledExecutorService API를 사용합니다.
더 나은 테스트 가능성
일반 메서드와 실행자 목은 EJB 컨테이너 없이 단위 테스트를 간단하게 만듭니다.
클라우드 네이티브 친화적
관리된 실행자는 컨테이너 생명주기와 통합되고 경량 런타임에서 작동합니다.
이전 방식
EJB TimerService
모던 방식
ManagedScheduledExecutorService
JDK 버전
11
난이도
중급
JDK 지원
EJB 타이머 대 Jakarta 스케줄러
사용 가능
Jakarta EE 10 / Concurrency 3.0 이후 사용 가능
동작 원리
EJB 타이머는 @Timeout 콜백과 ScheduleExpression을 사용하는 @Stateless 또는 @Singleton 빈이 필요합니다. ManagedScheduledExecutorService는 컨테이너 관리 스레드로 표준 ScheduledExecutorService API를 제공합니다.
관련 문서