2016-06-14 1 views
1

경로에 변수를 저장하기 위해 교환 헤더를 사용하고 있습니다. 그러나이 경로가이 경로에서 호출되는 다른 경로로 계속 이동하게됩니다.Apache-Camel : 교환 헤더의 범위를 제어하는 ​​방법은 무엇입니까?

아래 샘플에서는 http 끝점을 호출하는 getContact 경로를 호출합니다. 하지만, 그것은 또한 변수를 & variable2 헤더를 보낼 것입니다, 그것은 초기 경로에서 직접 가지고 : 시작.

from("direct:start") 
      .setHeader("variable1", constant("value1")) 
      .setHeader("variable2", constant("value2")) 
      .to("direct:getContact"); 

    from("direct:getContact") 
      .setHeader("Content-Type", constant("application/json")) 
      .setHeader("Accept", constant("application/json")) 
      .setHeader(Exchange.HTTP_METHOD, constant("GET")) 
      .to("http://<host>:<port>/contact/3") 
      .unmarshal().json(JsonLibrary.Jackson); 

이 문제를 방지 할 수있는 방법이 있습니까? 반대로 java의 메소드 호출은 컨텍스트 전환을 통해 기존 변수를 모두 숨 깁니다.

답변

1

http4를 사용하여 웹 서비스 호출을 보내기 전에 문제가 발생했습니다. Tt는 Camel이 http4/http 엔드 포인트를 사용할 때 전체 교환기를 전송하는 것보다 다소 성가신 일을합니다. 나는 이것을 content enricher을 사용하여 해결했다. 나는 enrich 라우트에서 http4를 사용하여 실제 호출을 배치하고 나중에 두 메시지를 결합하는 간단한 집계 전략을 가졌습니다.

또는 빈으로 호출 할 수 있습니다. 이렇게하면 낙타의 혜택을 일부 상실하지만 통화 시신을 완벽하게 제어 할 수 있습니다.

0

그냥 사용

.removeHeaders("variable*") 

것은 어떤 패턴의 헤더를 제거 할 수 있습니다.

1

이 문제를 직접적으로 피할 방법은 없습니다. 헤더를 하드 코딩 된 값으로 설정하는 경우 헤더를 끝점의 URI 속성으로 이동할 수 있습니다. 그렇지 않다면 정말로 다른 2 가지 옵션 만 있습니다. 첫 번째 옵션은 HTTP 호출 후 remove header 호출을 사용하여 모든 헤더를 제거하여 다운 스트림으로 이동하지 않는 것입니다. 두 x 째는 http 호출과 동일한 라우트에 모든 헤더를 설정하고 엔드 포인트가 enrich 문과 다른 경로 호출을 가지며 집계에서 리턴 된 교환을 사용자 정의 할 수있는 기본 라우트로 되돌려 야합니다. 여기

는 경로의 URI http://camel.apache.org/http4.html

샘플에서 제거 헤더

from("direct:start") 
    .setHeader("variable1", constant("value1")) 
    .setHeader("variable2", constant("value2")) 
    .setHeader("Content-Type", constant("application/json")) 
    .setHeader("Accept", constant("application/json")) 
    .setHeader(Exchange.HTTP_METHOD, constant("GET")) 
    .to("http://<host>:<port>/contact/3") 
    .unmarshal().json(JsonLibrary.Jackson) 
    .removeHeaders("variable*") 
    .to("Anything I call now won't have the variable headers"); 

농축 전화

를 넣을 수 있는지 확인하기 위해 허용 된 모든 헤더에 대한 낙타 HTTP 참조 페이지입니다
AggregationStrategy aggregationStrategy = new ExampleAggregationStrategy(); 

from("direct:start") 
    .enrich("direct:getContact", aggregationStrategy) 
    .to("You can have no additional headers here"); 

public class ExampleAggregationStrategy implements AggregationStrategy { 
    public Exchange aggregate(Exchange original, Exchange resource) { 
     Object originalBody = original.getIn().getBody(); 
     Object resourceResponse = resource.getIn().getBody(); 
     Object mergeResult = //TODO implement this however you want. You can remove any headers here you like 
     if (original.getPattern().isOutCapable()) { 
      original.getOut().setBody(mergeResult); 
     } else { 
      original.getIn().setBody(mergeResult); 
     } 
     return original; 
    } 
} 

사실 낙타의 문서를 살펴볼 때 재미있는 물건을 발견 할 때 1 가지 더 많은 옵션이 떠 올랐습니다. 면책 조항 나는 아직 낙타 2.15 atm을 달리고 있기 때문에이 부동산을 직접 사용해 보지 못했다. 그러나 정말로 빨리 테스트해라. 그것은 당신이 필요로하는 것일지도 모른다.

copyHeaders

기본 : 사실

낙타 2.16 :이 옵션을 복사 전략에 따라 교환 헤더로 복사됩니다 교환 헤더 다음에 해당하는 경우. 이것을 false로 설정하면 HTTP 응답의 헤더 만 포함 할 수 있습니다 (IN 헤더를 전파하지 않음).

관련 문제