计时器与实例无关

时间:2013-10-28 10:40:39

标签: java timer http-get

类中的非静态方法发送经常“挂起”的HTTP get请求(永远等待响应);为了在超时后删除它,我使用了Timer,如this SO question所示。

每次调用方法并启动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与一个实例相关;来自前一个实例的计时器如何中止属于另一个实例的get?

1 个答案:

答案 0 :(得分:0)

  

来自前一个实例的计时器怎么可能   中止属于另一个实例的get?

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

所有processRequest()实例共享相同的应用程序,因此在其中一个实例中调用System.exit(1);会导致所有这些实例被杀死