배치 처리, 정기 리포트 생성, 주기적인 데이터 동기화 등 시간 기반 작업은 모든 기업 시스템에 존재합니다. Camel은 Timer와 Quartz라는 두 가지 스케줄링 컴포넌트를 제공합니다.
일정 간격으로 반복 실행할 때는 Timer 컴포넌트가 가장 간단합니다.
// 5초마다 실행
from("timer:cleanup?period=5000")
.log("정리 작업 실행")
.to("bean:cleanupService");
// 10초 후 단 한 번만 실행
from("timer:init?delay=10000&repeatCount=1")
.to("bean:initService"); Timer는 단순하지만 복잡한 크론 스케줄은 표현하기 어렵습니다. 예를 들어 “평일 오전 9시에만 실행”같은 조건은 Quartz가 필요합니다.
Quartz는 기업용 스케줄러로, 크론 표현식을 지원합니다. camel-quartz2 의존성을 추가하면 사용할 수 있습니다.
// 매일 오전 9시에 실행 (크론: 초 분 시 일 월 요일)
from("quartz2:daily-report?cron=0+0+9+*+*+?")
.to("bean:reportService?method=generateDaily");
// 평일(월-금) 오전 8시 30분에 실행
from("quartz2:weekday-sync?cron=0+30+8+?+*+MON-FRI")
.to("direct:syncData"); Quartz는 내부적으로 데이터베이스에 스케줄 상태를 저장할 수 있어서, 서버 재시작 후에도 놓친 실행을 보완(misfire) 처리할 수 있습니다.
실제 배치 시스템에서 자주 사용하는 패턴을 살펴보겠습니다.
from("quartz2:etl?cron=0+0+2+*+*+?") // 새벽 2시
.to("sql:SELECT * FROM staging_orders WHERE processed=0")
.split(body())
.to("bean:orderProcessor")
.to("sql:UPDATE staging_orders SET processed=1 WHERE id=:#id")
.end()
.log("배치 완료"); 클러스터 환경에서 여러 서버가 동시에 배치를 실행하면 중복 처리가 발생할 수 있습니다. Quartz의 클러스터링 기능이나 Camel의 Idempotent Consumer EIP를 함께 사용하면 이 문제를 해결할 수 있습니다.
from("quartz2:clustered-batch?cron=0+0+1+*+*+?")
.idempotentConsumer(header("jobId"),
JdbcMessageIdRepository.jpaMessageIdRepository(entityManager, "batch"))
.to("bean:batchService"); 필기 시험의 접근통제 영역은 용어 하나만 알아도 풀리는 문제와 개념을 뒤집어 묻는 문제가 섞여 나옵니다.…
유튜브에 AI 자동 생성 영상이 넘쳐납니다. 진짜 크리에이터들은 어떻게 살아남아야 할까요? AI와 경쟁하는 3가지 생존…
이틀 전에 사이드카가 걸렸을 때만 해도 "한 번 놀란 장"으로 끝날 줄 알았는데요. 15일 아침…
오전 시황 글에 이어 장중 후속 정리입니다. 코스피는 개장 직후 5%대였던 낙폭이 오전 10시 전후에…
10월 15일 목요일 아침, 코스피가 전날 종가보다 5.59% 낮은 5,673.01로 출발했습니다. 장 시작 7분 만에…
삼성 갤럭시 AI, 써보니 실망스러웠다. 온디바이스 한계, 지역 제한, 낮은 일상 활용도 등 현실적인 문제점…