0

类中的非静态方法发送一个经常“挂起”的 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是相对于一个实例;来自前一个实例的计时器如何中止属于另一个实例的获取?

4

1 回答 1

0

来自前一个实例的计时器如何中止属于另一个实例的获取?

因为System.exit(1); 在整个应用程序上运行。一旦启动该计时器,它将在超时后终止整个应用程序。除非取消。

所有processRequest()实例共享同一个应用程序,因此调用System.exit(1);其中一个会杀死所有实例

于 2013-10-28T11:47:09.057 回答