스트림에서만 작동하는 메모리 효율적인 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()
는 HttpExchange
인 CachedExchange
org.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&throwExceptionOnFailure=false&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에있는이 스레드를 참조하십시오.
클로스을 수행하는 방법이 요리 책의 예제를 참조하십시오, 내 업데이트 된 질문을 살펴 보시기 바랍니다. 감사! – Ralf