2011-08-15 6 views
0

여러 파일을 동시에 업로드 할 수있는 응용 프로그램을 개발할 때 Java 애플릿을 사용했습니다.모든 HTTP 연결을 닫습니다.

여러 스레드가 동시에 파일 업로드를 처리하고 있습니다.

사용자가 [취소] 버튼을 클릭하면 모든 업로드가 취소됩니다.

http 연결을 통해 업로드하는 데 HttpMethod를 사용하고 있습니다.

http 연결의 모든 인스턴스를 동시에 닫으려면 어떤 접근 방식을 따라야합니까?

manager = new MultiThreadedHttpConnectionManager(); 
manager.shutdownAll() 

그러나 사용자가 다시 시작 버튼을 다시 한번 클릭 할 때, 내가 만들려고 오전 : 사용자가 모든 연결을 중지하려면 취소 버튼을 클릭하면 다음과 같이

나는 연결 관리자를 폐쇄 연결 관리자의 새 인스턴스이지만 그렇게 할 수 없습니다.

나는

java.lang.IllegalStateException: Connection factory has been shutdown 

은 또한, 나는이 Thread.interrupt()하지만 적절하게 작동하지 않는 즉 중단 모든 스레드와 시도 오류를 얻고있다.

모든 제안/힌트가 도움이 될 것입니다.

+0

어떤 클라이언트를 사용하고 있습니까? "HttpMethod"는 GET, POST 등을 말하지만 클라이언트가 아닙니다. 전의. HttpUrlConnection, HttpClient. – seand

+0

HttpClient 사용 – chiranjib

답변

0

간단한 접근 방법은 모든 업로드 스레드를 중단하는 것입니다. 업로드 된 실행 파일은 InterruptedException을 채우고 공유 취소 플래그를 쿼리하고 http 요청을 취소해야합니다. 실행 가능한 업로드 노동자에

:

public void onCancel(){ 
setCancelled(true); 
for(UploadWorker uploadWorker: uploadWorkers){ 
    uploadWorker.interrupt(); 
} 
} 
+1

Socket에서 읽기를 방해 할 수도 있고하지 않을 수도 있습니다. 이는 지정되지 않고 플랫폼에 따라 다릅니다. – EJP

+0

@EJP 동의 함; 최근에 상황이 바뀌지 않는 한 소켓 내부에서 차단 된 스레드에 대해 interrupt()를 수행하면 소켓이 해제되지 않습니다. – seand

0

그냥 닫고 분리 한 제어 스레드에서

try{ 
//do http work here 
}catch (InterruptedException e){ 
    if(task.isCancelled()){ 
    //cancel http upload 
    } 
} 

. read()에서 블록 된 스레드는 IOException 또는 SocketException을 던질 것이므로이를 처리하기 위해 코드를 작성해야합니다.

0

스레드 A가 소켓 내부에서 차단 된 경우 해당 스레드를 닫고 'A'를 해제 할 수있는 다른 스레드 ('B'라고합니다)를 가질 수 있어야합니다. 나는 이것이 HttpClient에서 어떻게 작동하는지 정확히 기억하지 못한다. 그러나 그것은 후드 아래의 소켓을 사용하므로 여전히 적용되어야한다.

단일 스레드 'B'는 모든 소켓을 순차적으로 차단 해제 할 수 있어야합니다. 이것은 잔인 함이 될 수 있지만 close()에서 멈추는 것이 우려되면 각 차단 된 소켓에 대해 별도의 스레드를 생성 할 수 있습니다.

관련 문제