2011-08-15 13 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などのようなものを指しますが、クライアントではありません。 Ex。 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がソケット内でブロックされている場合は、そのソケットを閉じるために別のスレッド(「B」と呼ぶ)を持つことができます。私はHttpClientでこれがどのように動作するのか正確には思い出せませんが、フードの下でソケットを使用するので、まだ適用されるはずです。

シングルスレッド 'B'は、すべてのソケットを順次ブロック解除できる必要があります。これはおそらく過剰ですが、何かがclose()でスタックする可能性があるという懸念がある場合、ブロックされたソケットごとに別々のスレッドを生成できます。

関連する問題