Apache Camel은 기존 Java Bean(POJO)을 라우트에 쉽게 통합할 수 있습니다. 특별한 인터페이스를 구현하거나 Camel에 의존하는 코드를 작성하지 않아도 됩니다. 이것이 Service Activator 패턴의 핵심입니다.
Service Activator 패턴은 메시지 기반 시스템에서 일반 서비스(Bean)를 메시지로 활성화하는 패턴입니다. Camel은 이 패턴을 통해 비즈니스 로직(Bean)을 메시지 라우팅 인프라로부터 완전히 분리합니다.
@Component
public class OrderService {
public Order processOrder(String json) {
// Camel을 모르는 순수한 비즈니스 로직
Order order = parseJson(json);
order.setStatus("PROCESSED");
return order;
}
public boolean isValid(Order order) {
return order.getAmount() > 0 && order.getCustomerId() != null;
}
}
// 라우트에서 사용
from("direct:newOrder")
.bean(OrderService.class, "processOrder") // 클래스 직접 지정
.log("처리 완료: ${body}"); // Spring Bean이 자동 등록된 경우
from("direct:newOrder")
.bean("orderService", "processOrder") // Bean 이름으로 참조
.to("direct:validate"); // Camel이 적합한 메서드를 자동으로 찾음
from("direct:order")
.bean(OrderService.class); // 메서드 자동 선택 @Component
public class AdvancedOrderService {
// Exchange를 직접 받아야 할 때
public void processWithContext(Exchange exchange) {
Message in = exchange.getIn();
String orderId = in.getHeader("orderId", String.class);
Order order = in.getBody(Order.class);
// 처리...
in.setBody(order);
in.setHeader("processed", true);
}
// Message를 직접 받는 방법
public Order process(Message message) {
return doProcess(message.getBody(Order.class));
}
} @Component
public class OrderValidator {
// Predicate로 활용: boolean 반환
public boolean isHighValue(Order order) {
return order.getAmount() > 500000;
}
// 헤더 검사
public boolean hasRequiredHeaders(@Header("customerId") String customerId,
@Header("orderDate") String date) {
return customerId != null && date != null;
}
}
// filter에서 Bean 사용
from("direct:orders")
.filter().method(OrderValidator.class, "isHighValue")
.to("direct:vipProcessing");
// choice에서 Bean 사용
from("direct:orders")
.choice()
.when().method(OrderValidator.class, "isHighValue")
.to("direct:vip")
.otherwise()
.to("direct:normal");
@Component
public class OrderCalculator {
// Expression으로 활용: 값 반환
public String generateOrderId(Order order) {
return "ORD-" + System.currentTimeMillis() + "-" + order.getCustomerId();
}
}
from("direct:newOrder")
.setHeader("orderId", method(OrderCalculator.class, "generateOrderId"))
.log("주문 ID: ${header.orderId}"); 2025년 Apache Camel의 최신 트렌드를 분석합니다. AI/LLM 통합 컴포넌트, 서버리스 배포, Camel K 진화, WebAssembly…
Camel in Action을 완독한 후 Apache Camel의 전체 그림을 다시 정리합니다. 핵심 철학, 학습 경로,…
Apache Camel 2.x에서 3.x, 4.x로 마이그레이션하는 단계별 가이드입니다. 주요 API 변경사항, 제거된 컴포넌트, 자동화 도구…
Apache Camel 라우트에서 발생하는 문제를 디버깅하고 해결하는 실전 기법을 설명합니다. 로그 분석, breakpoint 디버깅, Tracer,…
Apache Camel을 프로젝트에 도입하기 전 알아야 할 핵심 사항을 정리합니다. 학습 곡선, 도입 비용, 적합한…
엔터프라이즈 통합 패턴(EIP) 20가지를 Apache Camel 코드와 함께 한 번에 정리합니다. 메시징 채널, 메시지 라우팅,…