类中的非静态方法发送一个经常“挂起”的 HTTP 获取请求(永远等待响应);为了在一定的超时后将其切断,我使用了这个 SO questionTimer
中所示的a 。
每次调用该方法并启动 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 为它所属的类的每个实例调用一次;第一次调用后,程序在timeout
.
编辑:或者它可能是第一个继续运行的计时器,当我收到 get 响应时我需要杀死它?
Edit2:好的,解决了它:timer.cancel()
在收到响应时添加可以避免问题。但我不明白为什么!get
是相对于一个实例;来自前一个实例的计时器如何中止属于另一个实例的获取?