0

クラス内の非静的メソッドが、頻繁に「ハング」する (応答を永久に待機する) HTTP get 要求を送信します。特定のタイムアウト後にそれをカットするために、この SO questionTimerに示されているようにa を使用します。

メソッドが呼び出されて get が開始されるたびに、タイマーがゼロから開始されることを期待しています。

しかし、それは起こりません。メソッドが最初に呼び出されたときにタイマーが開始され、プログラム全体の実行中に実行が継続されます。タイムアウトになると、現在実行中の get リクエストが中止されます。

これが私のコードです(簡略化):

public void processRequest() throws Exception {
  final HttpClient client = HttpClientBuilder.create().build();
  final String target = this.someString;
  final int timeout = 10;
  HttpGet get = new HttpGet(target);

  Timer timer = new Timer();
  timer.schedule(new TimerTask() {
    public void run() {
      try {
        get.abort();
        // if the request times out it probably means
        // the server is down so we exit the program
        // and don't run any more requests
        System.exit(1);
        }
     catch (Exception e) {
        // warn that something went wrong
        }
      }
    }, timeout * 1000);
  //Execute and get the response
  final HttpResponse response = client.execute(get);
  final int code = response.getStatusLine().getStatusCode();
  if (code == 200) {
    // do something with the response, etc.
    }
  }

processRequest は、それが属するクラスのインスタンスごとに 1 回呼び出されます。最初の呼び出しの後、プログラムは の期間後に終了しますtimeout

編集:または、実行を継続するのは最初のタイマーであり、get 応答を受け取ったときにそれを強制終了する必要があるのでしょうか?

Edit2:わかりました、それで解決します:timer.cancel()応答が受信されたときに追加すると、問題が回避されます。しかし、私は理由を理解していません!get1 つのインスタンスに相対的です。前のインスタンスからのタイマーが別のインスタンスに属する get を中止するにはどうすればよいですか?

4

1 に答える 1

0

前のインスタンスからのタイマーが別のインスタンスに属する get を中止するにはどうすればよいですか?

System.exit(1); アプリケーション全体で動作するためです。そのタイマーを開始すると、タイムアウト後にアプリケーション全体が強制終了されます。キャンセルされない限り。

すべてのインスタンスが同じアプリケーションを共有しているため、そのうちの 1 つをprocessRequest()呼び出すとすべてのインスタンスが強制終了されますSystem.exit(1);

于 2013-10-28T11:47:09.057 に答える