2014-03-27 3 views
0

Camel에서 true 또는 false 일 수있는 플래그에서 메시지의 끝점을 선택하는 메커니즘을 연구 중입니다. 이것은 업스트림 채널이 대량으로 침수당하는 경우 대량 인제 스트 엔드 (HDFS로 전송)로 메시지를 다시 라우팅하는 조절 메커니즘입니다.Camel의 DynamicRouting

는 궁극적으로, 내 경로는 다음과 같습니다

from("queue:myqueue").bean("messageParser") 
    .dynamicRoute(bean(ThrottleHelper.class, 'buildEndpoint')); 

from('direct:regular').to('hbase'); 

from('direct:throttle').to('hdfs'); 

내 ThrottleHelper 클래스의 buildEndpoint 방법은 다음과 같습니다

public static String buildEndpoint() { 
    synchronized(shouldThrottle) { 
     if(shouldThrottle) 
     return "direct:throttle"; 
     else 
     return "direct:regular" 
    } 
} 

을 현재 내가에서 checkStatus()라는 클래스의 방법이있다; shouldThrottle (정적 변수)을 설정합니다. checkStatus()는 매분마다 Camel 석영 타이머에서 실행됩니다.

나는 이상한 행동을 감지했으며, 나는이 패턴을 오용하고 있다고 생각합니다. Camel의 패턴 구현에 대한 추가 검색에서, 리턴 된 각 엔드 포인트가 메시지에 의해 통과 된 후에 buildEndpoint()가 호출되는 것처럼 보입니다. 사실입니까? 또는 "direct : throttle"또는 "direct : regular"로 이동 한 후에 경로가 종료 될 것으로 예상 할 수 있습니까?

내가 웹상에서 수집 한 것부터 내 방법이 실제로 이렇게 보이게해야합니까?

public static String buildEndpoint(Message message) { 
    if(message.getHeader('throttled') != null) 
     return null; 
    else 
     message.setHeader('throttled', true); 

    synchronized(shouldThrottle) { 
     if(shouldThrottle) 
     return "direct:throttle"; 
     else 
     return "direct:regular" 
    } 
} 

고마워요!

+0

Nevermind. 단위 테스트를 통해이 동작을 확인했습니다. 두 번째 방법은 나열된 (메서드가 호출되었는지 확인하는 테스트) 메서드입니다. 다음 질문 - 왜 내 ThrottleHelper가 각 메시지의 헤더를 "shouldThrottle"속성으로 보완하고 해당 헤더 속성을 기반으로 콘텐츠 기반 라우팅을 사용하는 대신 dynamicRouter를 사용합니까? –

답변

0

official documentation에서 두 번째 구문이 올바른 사용법에 더 가깝습니다. 기본적으로 동적 라우터는 즉시 종료되는 단일 끝점뿐만 아니라 여러 끝점을 통해 메시지를 라우팅하는 데 사용할 수 있습니다. 동적 라우터에게 메시지를 다른 엔드 포인트로 라우트하는 것을 중지 시키려면, 최종 메시지 스니 j에서 작성한대로이 메시지의 라우팅이 완료되었음을 나타 내기 위해 bean은 null을 리턴해야합니다.

+0

여기에있는 아이디어는 내 메시지에 추가 속성을 저장하지 않아도 되려고했습니다. 또한 메시지가 통과해야하는 종점을 파악하기 위해 필터/선택 항목을 반복해야하는 번거 로움을 피할 수있었습니다. 그러나 메시지에 상태를 저장해야하는 경우 특히 가치가있는 것보다 더 많은 문제가있는 것으로 보입니다. 여기서 choice() 구조를 사용하는 것이 더 낫습니다. –

+0

충분히 좋지만 콘텐츠 기반 라우팅 아이디어가 실제로이 경우 가장 좋은 방법이라고 생각합니다. 추가 속성을 사용하여 메시지를 풍부하게 만드는 것은 매우 가벼운 옵션이며, 기본적으로 정확한 사용 사례를 용이하게하는 데 도움이됩니다. 당신의 요구에 더 잘 맞는 도구를 가까이에 사용할 수도 있습니다. – ProgrammerDan

+0

동의. 귀하의 회신에 감사드립니다! –

0

프로그래머가 지적한 것처럼 동적 라우터는 여러 끝점을 통해 메시지를 라우팅하는 데 사용되므로 명시 적으로 null을 반환하여 라우팅의 끝을 나타낼 필요가 있습니다.

표현식 또는 bean 메소드를 사용하여 단일 끝점을 선택하기 만하면 동적 수신자 목록을 사용하는 것이 더 좋습니다 (cfr http://camel.apache.org/recipient-list.html). 경로 작성기에서 .dynamicRoute() 대신 .recipientList()을 사용하면 첫 번째 buildEndpoint 메소드 구현이 정상적으로 작동합니다.

관련 문제