2010-08-09 9 views
1

HttpClient을 사용하여 HTTP 요청에서 긴 폴링 ThreadPoolExecutor 내에서 실행되는 Runnable이 있습니다. 폴링 HTTP 요청을 죽입니다.

그래서 난 아주 방법으로 요청을하고있는 중이 야 :
httpClient = new HttpClient(new MultiThreadedHttpConnectionManager()); 
    clientParams.setSoTimeout(timeout); 
    HttpMethodBase method = new GetMethod(request.toString()); 
    int iGetResultCode = 0; 
    iGetResultCode = httpClient.executeMethod(method); 

지금 난 정말 (아무래도)는 다른 스레드에서 폴링을 취소하고 싶습니다.

shutdown은 실제로 작동하지 않으므로 다른 방법을 시도해 볼 수 있습니다.

답변

1

나는이 사람의 스티븐 C와 함께있다. httpclient.executeMethod는 InterruptedException (IO 또는 기타 여부)에 반응해야하는 것처럼 보입니다. 예외 전파가 보이지 않으면 HttpClient에서 InputStream을 닫으십시오.

method.getResponseBodyAsStream().close(); 

이것은 웹 사이트에서 읽는 입력 스트림을 닫고 스레드 풀 스레드가 볼 IOException을 던져야합니다. 연결이 닫히지 만 여전히 IOException이 표시되지 않으면 어딘가에서 예외를 삼키고 있다고 가정합니다.

+0

아직 응답이 없으므로 응답이 없습니다. 이 작업은 실패합니다. 그러나 귀하의 요점은 내가 조금 더 검색하게 만들었고, 나는 HttpMethodBase가 간단한 방법 abort()를 가지고 있음을 발견했습니다 ... lol – Roman

0

연결된 문서에서 다음 단계를 시도해보십시오 - shutdownNow();

설명서에 다음과 같이 설명되어 있습니다. - 문제가 발생한 스레드에서 Thread.interrupt()를 호출하면 InterruptedException이 발생합니다.이 예외를 제대로 처리하고 무시하지 않아야합니다.

+0

죄송합니다.이 기능도 작동하지 않습니다. shutdown (true)은 동일한 작업을 수행합니다. 아시다시피 InterruptException은 확인 된 예외입니다. 예외를 throw하는 차단/대기 작업이 없습니다. – Roman

+0

@Roman - 시도해 보셨습니까? 나는'HttpClient.executeMethod (...)'가'Socket.connect()'를 호출 할 것이라고 생각한다. 'connect' 호출 중'Thread.interrupt()'는'InterruptedIOException'을 던져야합니다. –

0

스레드를 죽이는 것은 항상 나쁜 생각입니다.

대신 스레드를 깨끗하게 종료해야합니다. 계속 폴링을 계속해도 괜찮 으면 동기화 된 부울 필드를 추가하여 확인하십시오.

이렇게해도 HTTP 요청이 소켓에 계속 차단 될 수 있습니다. 이 것을 그냥두고 결과가 반환 된 후에 무시하는 것이 좋습니다. 다른 방법은 다른 스레드에서 소켓을 닫는 것입니다. (이 경우 어떻게해야할지 모르겠다.)

+0

당신은 아마 그것을 얻지 못한다. 요청은 긴 폴링 블록 == 블로킹 동작 내부에있다. 아무 상태도 없다. – Roman

+0

설문 조사 사이에이를 확인할 수 있어야합니다. 또한 소켓을 닫는 것에주의하십시오. – iny

+0

폴링이 차단 작업입니다. 설문 조사를 취소하고 싶습니다. 투표 사이에 없음 – Roman

관련 문제