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