CAP for Java

cron 0줄 — CAP @Scheduled 배치 설정 #shorts #SAP #CAPforJava

이 글이 답하는 질문

  • 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

아직 댓글이 없습니다.