Java DSL – Camel의 가장 강력한 인터페이스
Apache Camel의 Java DSL은 메서드 체이닝(Fluent API) 방식으로 라우팅 규칙을 정의합니다. IDE의 자동 완성 지원을 받을 수 있고, 컴파일 시점에 오류를 잡을 수 있어 실무에서 가장 많이 사용됩니다.
RouteBuilder의 기본 구조
import org.apache.camel.builder.RouteBuilder;
@Component
public class ShopRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
// 오류 처리 전역 설정
errorHandler(deadLetterChannel("jms:queue:dead-letter")
.maximumRedeliveries(3)
.redeliveryDelay(1000));
// 라우트 정의
from("direct:newOrder")
.routeId("order-route")
.description("신규 주문 처리 라우트")
.log("신규 주문: ${body}")
.choice()
.when(simple("${body.amount} > 100000"))
.to("direct:vipOrder")
.otherwise()
.to("direct:normalOrder")
.end();
}
}
자주 사용하는 DSL 메서드들
from(uri): 라우트 시작점 정의to(uri): 메시지 전송 (동기)toD(uri): 동적 URI로 전송log(message): 로깅process(processor): 커스텀 처리transform(expression): 메시지 본문 변환setBody(expression): 본문 설정setHeader(name, expression): 헤더 설정filter(predicate): 조건부 필터링choice() / when() / otherwise(): 조건 분기
direct: 컴포넌트로 라우트 연결
direct: 컴포넌트는 동일한 CamelContext 내에서 라우트 간 직접 호출에 사용됩니다. 메서드 호출처럼 동기적으로 동작합니다.
from("direct:orderInput")
.to("direct:validateOrder")
.to("direct:saveOrder")
.to("direct:notifyUser");
from("direct:validateOrder")
.log("주문 유효성 검사 중...")
.bean(OrderValidator.class);
표현식(Expression)과 술어(Predicate)
DSL에서 조건이나 값을 지정할 때 다양한 표현식 언어를 사용할 수 있습니다.
// Simple 언어 (가장 많이 사용)
.when(simple("${header.orderType} == 'URGENT'"))
.setBody(simple("주문번호: ${header.orderId}, 금액: ${body.amount}"))
// Constant
.setHeader("source", constant("web-shop"))
// Bean 표현식
.setBody(method(MyBean.class, "processOrder"))
// SpEL (Spring Expression Language)
.when(spel("#{request.headers['user-agent'].contains('Mobile')}")))
라우트 ID와 관리
모든 라우트에는 고유 ID를 부여하는 것이 좋습니다. 모니터링, 동적 관리, 로그 추적에 필수적입니다.
from("timer:heartbeat?period=60000")
.routeId("system-heartbeat")
.routeGroup("monitoring")
.autoStartup(true)
.log("시스템 정상 동작 중");
람다로 간결하게 Processor 정의
from("direct:process")
.process(e -> {
String input = e.getIn().getBody(String.class);
e.getIn().setBody(input.trim().toUpperCase());
})
.log("처리 완료: ${body}");