이 글이 답하는 질문
- CAP for Java에서 주기적인 배치 작업을 어떻게 구현하나요?
- @Scheduled 어노테이션 하나로 cron을 직접 구현하지 않아도 되나요?
- Spring의 @Scheduled을 CAP 서비스에서 바로 쓸 수 있나요?
직접 해보기
1. 의존성 확인 — Spring Scheduling 활성화
// Application 진입점에 @EnableScheduling 추가
@SpringBootApplication
@EnableScheduling
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2. CAP 서비스 클래스에 @Scheduled 적용
@Component
public class OrderCleanupJob {
@Autowired
private PersistenceService db;
// 매일 02:00 KST 실행 (UTC 17:00)
@Scheduled(cron = "0 0 17 * * *")
public void deleteExpiredOrders() {
var result = db.delete(Orders_.class)
.where(o -> o.status().eq("EXPIRED"))
.execute();
log.info("삭제된 주문: {}건", result.rowCount());
}
}
3. 고정 주기 실행 (fixedRate)
// 5분마다 외부 시스템 상태 폴링
@Scheduled(fixedRate = 300_000)
public void pollExternalSystem() {
// PersistenceService or CqnService 호출 가능
}
삽질 노트
- @Scheduled 메서드는 반드시
void반환 + 파라미터 없음 — 반환값이 있거나 파라미터를 선언하면 Spring이 등록 자체를 거부한다. - CAP CqnService·PersistenceService는 RequestContext가 없는 스케줄러 스레드에서도 동작하지만, EventContext가 필요한 로직(예: 핸들러 체인 호출)은
requestContext.attach()로 수동으로 컨텍스트를 붙여야 한다. - BTP Cloud Foundry 환경에서 여러 인스턴스가 뜨면 각 인스턴스마다 @Scheduled가 실행된다 — 중복 실행이 문제라면 분산 락이나 Quartz Cluster 설정이 필요하다.
핵심 한 줄
@EnableScheduling + @Scheduled(cron="...") — CAP for Java에서 배치를 시작하는 최소 조합이다.
더 파볼 주제
- Spring Quartz Scheduler — 분산 클러스터 환경에서 중복 실행 방지
- CAP RequestContext.attach() — 스케줄러에서 CDS 이벤트 수동 발행
- BTP Job Scheduling Service — Cloud Foundry 전용 크론 관리
댓글 0
아직 댓글이 없습니다.