8.18. 동적 라우터
8.18.1. 동적 라우터
그림 8.12. “동적 라우터 패턴” 에 표시된 대로 동적 라우터 패턴을 사용하면 설계 시 단계 시퀀스를 알 수 없는 일련의 처리 단계를 통해 메시지를 연속으로 라우팅할 수 있습니다. 메시지가 전달되어야 하는 끝점 목록은 런타임에 동적으로 계산됩니다. 메시지가 끝점에서 반환될 때마다 동적 라우터는 8080에서 다시 호출하여 경로의 다음 엔드포인트를 검색합니다.
그림 8.12. 동적 라우터 패턴
![동적 라우터](https://access.redhat.com/webassets/avalon/d/Red_Hat_Fuse-7.12-Apache_Camel_Development_Guide-ko-KR/images/3a5551f19a9a7ea6b616c88f27874575/dynamic_router.gif)
Camel 2.5 에서는 DSL에 동적Router
를 도입했습니다. 이 DSL은 플립을 즉시 평가하는 동적 8.7절. “라우팅 슬립” 과 같습니다.
dynamicRouter
(예: 8080)에 사용된 표현식이 null
을 반환하여 끝을 표시해야 합니다. 그렇지 않으면 dynamicRouter
가 끝없는 루프에서 계속됩니다.
8.18.2. Camel 2.5 이후의 동적 라우터
Camel 2.5에서 8.18절. “동적 라우터” 는 교환 속성인 Exchange.SLIP_ENDPOINT
를 업데이트하며, 슬립이 진행됨에 따라 현재 끝점을 업데이트합니다. 이를 통해 교환이 슬립을 통해 얼마나 진행되었는지 확인할 수 있습니다. 8.18절. “동적 라우터” 구현은 8.7절. “라우팅 슬립”을 기반으로 하므로 슬립입니다.
8.18.3. Java DSL
Java DSL에서는 다음과 같이 dynamicRouter
를 사용할 수 있습니다.
from("direct:start") // use a bean as the dynamic router .dynamicRouter(bean(DynamicRouterTest.class, "slip"));
빈 통합을 활용하여 다음과 같이 구현할 수 있는 on-the-fly 를 계산합니다.
// Java /** * Use this method to compute dynamic where we should route next. * * @param body the message body * @return endpoints to go, or <tt>null</tt> to indicate the end */ public String slip(String body) { bodies.add(body); invoked++; if (invoked == 1) { return "mock:a"; } else if (invoked == 2) { return "mock:b,mock:c"; } else if (invoked == 3) { return "direct:foo"; } else if (invoked == 4) { return "mock:result"; } // no more so return null return null; }
위 예제는 스레드로부터 안전하지 않습니다. 스레드의 안전성을 보장하기 위해 Exchange
에 상태를 저장해야 합니다.
8.18.4. Spring XML
Spring XML의 동일한 예는 다음과 같습니다.
<bean id="mySlip" class="org.apache.camel.processor.DynamicRouterTest"/> <camelContext xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:start"/> <dynamicRouter> <!-- use a method call on a bean as dynamic router --> <method ref="mySlip" method="slip"/> </dynamicRouter> </route> <route> <from uri="direct:foo"/> <transform><constant>Bye World</constant></transform> <to uri="mock:foo"/> </route> </camelContext>
8.18.5. 옵션
dynamicRouter
DSL 명령은 다음 옵션을 지원합니다.
이름 | 기본값 | 설명 |
|
| II 부. 라우팅 표현식 및 서술자 언어 에서 여러 끝점을 반환한 경우 사용되는 구분 기호입니다. |
|
| 엔드포인트 uri를 확인할 수 없는 경우 무시해야 합니다. 그렇지 않으면 Camel에서 엔드포인트 uri가 유효하지 않음을 나타내는 예외가 throw됩니다. |
1. @DynamicRouter 주석
@DynamicRouter
주석을 사용할 수도 있습니다. 예를 들면 다음과 같습니다.
// Java public class MyDynamicRouter { @Consume(uri = "activemq:foo") @DynamicRouter public String route(@XPath("/customer/id") String customerId, @Header("Location") String location, Document body) { // query a database to find the best match of the endpoint based on the input parameteres // return the next endpoint uri, where to go. Return null to indicate the end. } }
메시지가 슬립을 통해 진행됨에 따라 경로
메서드가 반복적으로 호출됩니다. 개념은 다음 대상의 끝점 URI를 반환하는 것입니다. 끝을 나타내는 null
을 반환합니다. 8.7절. “라우팅 슬립” 과 같이 여러 끝점을 반환할 수 있습니다. 여기서 각 끝점은 구분 기호로 구분됩니다.