2014-07-21 2 views
0

스트림에서만 작동하는 메모리 효율적인 HTTP 역방향 프록시를 구현하려고합니다. Jetty 소비자는 입력 스트림을 교환기에 넣고 요청을 전달하기 위해 http 제작자와 연결시킬 수 있습니다. 문제 없습니다.카멜 역방향 프록시 - 응답 스트림 캐싱 없음

그러나 내가 알고있는 모든 HTTP 생성자 (Jetty, http4, netty-http)는 응답 스트림을 힙 메모리로 읽어 들여 스트림의 핸들 대신 해당 형식 또는 다른 형식으로 해당 내용을 교환기에 배치합니다. 그리고 그들 중 누구도 그렇게 할 수있는 옵션을 제공하지 않는 것 같습니다.

나는이 문제를 설명하는 thread을 발견했으며 해결 방법을 제시합니다. 그러나 낙타 2.13.1에서 http4 HttpProducer의 코드를 살펴보면 제안 된 변경 사항이 결국 Camel 코드베이스로 변경된 것처럼 보이지 않습니다.

낙타와 함께 스트림 전용 방식을 구현할 수있는 방법이 있습니까?

http4 : -에 대한 추가 정보를 입력 스트림 메모리에 끝나는 정확히

<route id="reverse_proxy" streamCache="false"> 
    <from ref="jetty.http.server"/> 
    <bean ref="streamHolder" method="enableCaching"/> 
    <bean ref="streamHolder" method="parsePayloadHeaderInfoAndDoStuff"/> 
    <bean ref="streamHolder" method="resetStream"/> 
    <to ref="http.client"/> <!-- Register completion synchronization hook to close stream. --> 
    <bean ref="streamHolder" method="enableCaching"/> 
    <bean ref="streamHolder" method="parsePayloadResponseHeaderAndDoStuff"/> 
    <bean ref="streamHolder" method="resetStream"/> 
</route> 

편집 : 그래서, 최소한의 메모리 풋 프린트와 나는이의 라인을 따라 뭔가를 할 수 : 모든 것이 org.apache.camel.component.http4.HttpProducer :: process() -> populateResponse (..) -> extractResponseBody (..) ->doExtractResponseBodyAsStream()에서 발생합니다. 여기서 원본 스트림은 CachedOutputStream의 인스턴스로 복사됩니다.

부두 : org.eclipse.jetty.client.AsyncHttpConnection :: 핸들() ->org.eclipse.jetty.http.HttpParser::parseNext()HttpExchangeCachedExchangeorg.eclipse.jetty.client.ContentExchange에있는 바이트 배열을 기입 할 것이다.

netty-http : HttpResponse 콘텐츠를 복합 ChannelBuffer로 어셈블하는 파이프 라인을 빌드합니다. 래핑 된 채널 버퍼는 완전한 응답 스트림을 구성합니다.

3 개의 클라이언트를 모두 디버깅했으며 가지가 아닌 비틀 거림을받지 않아 원본 본문 입력 스트림을 교환 본문으로 남겨 둡니다.

이이만큼 간단한 경로로 재현 :

<camelContext id="pep-poc"> 
    <endpoint id="jetty.http.server" uri="jetty:http://{{http.host.server}}:{{http.port.server}}/my/frontend?disableStreamCache=true"/> 
    <endpoint id="http.client" uri="jetty:http://{{http.host.client}}:{{http.port.client}}/large_response.html?bridgeEndpoint=true&amp;throwExceptionOnFailure=false&amp;disableStreamCache=true"/> 

    <route id="reverse_proxy" startupOrder="10" streamCache="false"> 
     <from ref="jetty.http.server"/> 
     <to ref="http.client"/> 
    </route> 
</camelContext> 

나는 아파치가 large_response.html으로 7백50메가바이트 파일을 반환해야합니다. 2

편집은 사실이 사용할 수있는 모든 HTTP 생산에 문제가 있습니다. Camel mailing list 및 해당 JIRA ticket에있는이 스레드를 참조하십시오.

답변

0

필요에 따라 메시지 본문에 액세스하지 않는 한 스트림을 메모리로 읽지 않으며 Camel에 String 형식으로 메모리에 읽도록 ​​지시합니다.

는 스트림 기반의 프록시

+0

클로스을 수행하는 방법이 요리 책의 예제를 참조하십시오, 내 업데이트 된 질문을 살펴 보시기 바랍니다. 감사! – Ralf