2017-07-14 7 views
3

http投稿要求を出し、応答を得るまで待っているスレッドをどのように殺すかについての提案。私は、リクエストからの応答を受け取る前に、このスレッドを並列実行している別のスレッドから強制終了したい。私は、HTTP POSTリクエストを閉じるか中止するかの提案を受けましたが、うまくいきませんでした。誰かがこのシナリオでhttpリクエストを中止するにはどうすればいいか、あるいはこれを達成するための他の方法を提案できます。他のスレッドからhttpリクエストを行っているスレッドをキャンセルする方法

+1

'Thread.interrupt'を試してください。 – talex

+0

スレッドを停止する唯一の方法は、スレッドを中断する方法です。スレッドのrunメソッドが割り込みに正しく応答するか、そうでないかのどちらかです。そうでなければ、あなたができることは他にありません。 – VGR

+0

https://stackoverflow.com/questions/3000214/java-http-client-request-with-defined-timeoutまた、非同期httpを見ましたか? – efekctive

答えて

1

要求を行ったスレッドは、サーバーの応答を待つ間にブロックされます。スレッドダンプを取得して参照すると、read()メソッドではなくThread.sleepになります。したがって、interrupt()を呼び出すことは効果がありません(InterruptibleChannelでない限り)。 POSTリクエストが行われたソケットまたは出力ストリームにアクセスできますか?そうであれば、それを閉じることができます。これにより、例外が発生して読み込み待機から復帰します。 置くことができるコードサンプルがありますか?

+0

私たちが状態待ち状態になるのを待っている間にスレッド上でthread.getState()を実行するのは正しいです。そのため、割り込みがトリガされると、スレッドの割り込みフラグはセットされますが、要求を終了した後にスレッドは正常に終了します。 –

+0

Apache HTTPクライアントを使用していて、私はasynchttpを使用できません。私は –

+0

Apache HTTPクライアントを使用して要求してみました。私はasynchttpを使用できません。私は1つのスレッドを使用してリクエストを送信しようとしました。例:ReqThreadとリスナースレッドをキャンセルします。CancelThreadと私はhttpPostオブジェクトを保持する共有変数オブジェクトを持っています。実際の要求はクラスAで発生し、要求を送信するためにReqThreadによって送信されたhttpPostを使用します。 CancelThreadでcancelイベントリスンの実装を取り消して、** httppost.abort()**を発行する共有オブジェクトのReqThreaadによって設定されたhttpPostを読み込みます。ここで、IamがhttpPostオブジェクトをnullとして取得する問題があります。 –

1

皆さん、最後に、このクローズドソケットアイデアが実装され、機能しています。以下は私が試したスニペットです。

私の要求しているスレッドの取り消し

package com.pkg.myhttptest; 

import org.apache.http.client.methods.HttpPost; 

public class RequestThread implements Runnable{ 

    Message msg = null; 
    Util util = null; 
    public RequestThread(Message msg, Util util) { 
     this.msg = msg; 
     this.util = util; 
    } 
    public void run() { 
     System.out.println("its request thread"); 
     util.print(msg); 
    } 



} 

スレッド

public class CancelThread implements Runnable { 
    Message msg = null; 
    Util util = null; 
    public CancelThread(Message msg, Util util) { 
     this.msg = msg; 
     this.util = util; 
    } 
    public void run() { 
     System.out.println("its cancel thread"); 
     int i=0; 
     while(i<5){ 
      System.out.println("looping" + i); 
      i++; 
     } 
     System.out.println(msg.getHttpost() + "In cancelled"); 
     Header[] hdr = msg.getHttpost().getAllHeaders(); 
     System.out.println(hdr.length + "length"); 
     msg.getHttpost().abort(); 
     System.out.println(msg.getHttpost().isAborted()); 

    } 

} 

共有オブジェクト

public class Message { 

    HttpPost httpost; 

    public HttpPost getHttpost() { 
     return httpost; 
    } 

    public void setHttpost(HttpPost httpost) { 
     this.httpost = httpost; 
    } 
} 

Utilのクラス

public class Util { 
    private final String USER_AGENT = "Mozilla/5.0"; 

    public void print(Message msg) { 
     String url = "https://selfsolve.apple.com/wcResults.do"; 
     HttpPost post = new HttpPost(url); 
     HttpClient client = HttpClientBuilder.create().build(); 
     post.setHeader("User-Agent", USER_AGENT); 

     List<NameValuePair> urlParameters = new ArrayList<NameValuePair>(); 
     urlParameters.add(new BasicNameValuePair("sn", "C02G8416DRJM")); 
     urlParameters.add(new BasicNameValuePair("cn", "")); 
     urlParameters.add(new BasicNameValuePair("locale", "")); 
     urlParameters.add(new BasicNameValuePair("caller", "")); 
     urlParameters.add(new BasicNameValuePair("num", "12345")); 

     try { 
      post.setEntity(new UrlEncodedFormEntity(urlParameters)); 
      msg.setHttpost(post); 
      HttpResponse response = client.execute(post); 
      System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); 

      BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 

      StringBuffer result = new StringBuffer(); 
      String line = ""; 
      while ((line = rd.readLine()) != null) { 
       result.append(line); 
      } 
     } catch (UnsupportedEncodingException e) { 

     } catch (IOException e) { 
      e.printStackTrace() 
     } 
    } 

メインクラス

public class App 
{ 
    public static void main(String[] args) 
    { 
     Message msg = new Message(); 
     Util util = new Util(); 

     Thread reqThread = new Thread(new RequestThread(msg, util)); 
     Thread cancelThread = new Thread(new CancelThread(msg, util)); 

     System.out.println("Starting Threads"); 
     reqThread.start(); 
     try { 
      reqThread.sleep(2000); 
      cancelThread.start(); 
      cancelThread.join(); 
      System.out.println("closing.."); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

私は同意するが、それは動作します。その少し汚れたコード。それは以下の例外をもたらし、スレッドを殺します。

java.net.SocketException: Socket is closed 
    at java.net.Socket.getInputStream(Socket.java:876) 
    at sun.security.ssl.SSLSocketImpl.doneConnect(SSLSocketImpl.java:644) 
    at sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:549) 

私を助けてくれた皆さん、ありがとうございます。

関連する問題