クラス内の非静的メソッドが、頻繁に「ハング」する (応答を永久に待機する) 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()
応答が受信されたときに追加すると、問題が回避されます。しかし、私は理由を理解していません!get
1 つのインスタンスに相対的です。前のインスタンスからのタイマーが別のインスタンスに属する get を中止するにはどうすればよいですか?