0

HttpComponents의 최신 (4.2.x) 릴리스 중 하나를 고려해 볼 수 있습니다.HttpClient, HttpConnection 및 ClientConnectionManager 간의 관계

HttpClient의 인스턴스가 HttpConnection (예 : ManagedClientConnectionImpl 등)도 ClientConnectionManager의 인스턴스에 어떻게 연관되는지를 일반적으로 설명해주십시오. 누가 누구에 대해 알고 있습니까?

다음은 [Http] 접두사를 생략 한 것입니다. 따라서 HttpClient ->Client

ClientClientConnectionManager을 계속 유지합니다. 그 의미는 Client도 기본 Connection 개체에 대한 참조를 가지고 있습니까?

ConnectionManager은 모두 Clients에 대해 알고 있습니까?

execute을 수행하기 위해 HttpClient에서 사용하는 HttpGet은 스트림에 대해 알고 있고 응답을 통해 노출 된 Entity? (HttpGet 개체에 .abort()을 호출하여 스트림을 닫을 수 있기 때문에). HttpGet 인스턴스도 Connection 개체에 연결되어 있습니까?

혼란스럽고 위의 질문에 대한 자세한 답변을 주시면 감사하겠습니다. 예제를 제공하기 위해 이해를 쉽게하려면 DefaultHttpClient, ManagedClientConnectionImpl, BasicClientConnectionManager과 같은 특정 구현을 사용할 수 있습니다.

+0

HttpGet은 스트림에 대해 알지 못합니다. HttpClient는 않습니다 (또는 관리자) 않습니다. HttpGet 내부의 데이터를 사용하여 Get HTTP 요청을 생성합니다. 소스 코드를 다운로드하고 디버거를 사용하여 단계별로 진행하십시오. –

+0

@Sotirios 조언을 주셔서 감사합니다. 지금은 자세히 디버깅 할 수 없지만 응답이 없으면해야합니다. – kiruwka

답변

2

HttpClient은 요청 실행 파이프 라인의 외관입니다. 실행 파이프 라인의 정확한 구성은 HttpClient 인스턴스의 구성에 따라 다릅니다. 여러 개의 탭이있는 브라우저로 생각하십시오.

HttpClient 인스턴스 중 하나는 지속적 연결의 기본 풀을 공유하는 하나의 인스턴스에 의존 할 수 있습니다. ClientConnectionManager 인스턴스에는 인스턴스에 대한 지식이 전혀 없습니다. 그들은 단지 엔티티가 요청한 연결을 임대합니다.

각 요청은 특정 HttpContext 내에서 실행됩니다. HttpContext 인스턴스는 실제 HTTP 교환을 실행하는 데 관련된 모든 상태 저장 객체의 모음입니다. HttpContext 인스턴스는 스레드로부터 안전하지 않으므로 여러 작업자 스레드에서 공유 할 수 없습니다.

HttpClientManagedClientConnection 인스턴스를 ClientConnectionManager에서 임대합니다. 응답 메시지를 직렬화하여 반대 엔드 포인트로 전송하고, 응답 헤드를 수신하고 응답 내용을 읽지 않고 기본 연결을 응답 HttpEntity 인스턴스 (사용 가능한 경우)에 바인드합니다. 이는 HttpResponse 인스턴스의 소비자가 중간 메모리 내 버퍼링없이 응답 내용을 스트리밍 할 수있게합니다. 이것은 또한 소비자가 반응과 관련된 자원 (특히 ManagedClientConnection)의 적절한 공개를 보장 할 필요가있다.

+0

감사합니다. 이제 상황이 더욱 명확 해집니다. 그래서'HttpResponse'는 (Entity를 통해) 연결을 끊지 않는 것을 안다.어때'HttpGet'? 'HttpClient'가'execute'를 수행 한 후에도 기본 연결을 알고 있습니까? 연결에 대해서 알아야한다고 가정합니다. 왜냐하면'HttpGet'에서'abort()'를 호출 할 때 스트림이 열려 있다면 닫을 수 있기 때문입니다. – kiruwka

+0

AbortableHttpRequest 인터페이스는 연결 해제 작업뿐만 아니라 연결 임대 작업을위한 주입 지점을 제공합니다. 이것에 의해,이 인터페이스를 구현하는 모든 메소드가, 임의의 지점에서 요구의 실행을 중지 해, 기본이되는 접속을 해제 할 수가 있습니다. – oleg

+0

재미있는 소리. 구현 방법을보고이 주입이 어떻게 수행되는지 살펴보고 싶습니다. 아니면 답변에 코드 스냅 샷을 추가 할 수 있습니까? BTW, 당신은 Oleg Kalnichevski, HttpComponents 개발자입니까? – kiruwka