8.18. 동적 라우터

8.18.1. 동적 라우터

그림 8.12. “동적 라우터 패턴” 에 표시된 대로 동적 라우터 패턴을 사용하면 설계 시 단계 시퀀스를 알 수 없는 일련의 처리 단계를 통해 메시지를 연속으로 라우팅할 수 있습니다. 메시지가 전달되어야 하는 끝점 목록은 런타임에 동적으로 계산됩니다. 메시지가 끝점에서 반환될 때마다 동적 라우터는 8080에서 다시 호출하여 경로의 다음 엔드포인트를 검색합니다.

그림 8.12. 동적 라우터 패턴

동적 라우터

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 명령은 다음 옵션을 지원합니다.

이름

기본값

설명

uriDelimiter

,

II 부. 라우팅 표현식 및 서술자 언어 에서 여러 끝점을 반환한 경우 사용되는 구분 기호입니다.

ignoreInvalidEndpoints

false

엔드포인트 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절. “라우팅 슬립” 과 같이 여러 끝점을 반환할 수 있습니다. 여기서 각 끝점은 구분 기호로 구분됩니다.