2013-10-28 1 views
0

Нестатический метод в классе отправляет запрос HTTP-запроса, который часто «зависает» (ожидает ответа навсегда); чтобы сократить его после определенного таймаута, я использую 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.

Редактировать: может быть, это первый таймер, который продолжает работать, и мне нужно его убить, когда я получаю ответ от ответа?

Edit2: ok, который решает его: добавление timer.cancel() при получении ответа устраняет проблему. Но я не понимаю, почему! get относится к одному экземпляру; как возможно, чтобы таймер, исходящий из предыдущего экземпляра, прервал получение, принадлежащее другому экземпляру?

+0

System.exit (1); будет отклонять все ваше приложение. – dinesh707

+0

Да, это то, чего мы хотим; если у нас есть тайм-аут по любому запросу, это почти наверняка означает, что сервер не работает. И поэтому мы не хотим продолжать программу, потому что это приведет к отправке большего количества запросов на сервер, который отключен. Нам нужно позвонить кому-нибудь, чтобы вернуть сервер. – Bambax

+1

Вы когда-нибудь отменяете таймер после ответа, которого хотите? – arcy

ответ

0

как можно использовать таймер, исходящий из предыдущего экземпляра, в прерывать получение, принадлежащее другому экземпляру?

Поскольку System.exit(1); действует на всей территории применения. Как только вы запустите этот таймер, он уничтожит все приложение после таймаута. Если это не отменено.

Всех processRequest() экземпляров один и то же приложение, так призывающее System.exit(1); в одном из них убивает всех из них

+0

Я был в предположении, что если запрос уже ответил, было бы невозможно его прервать(), и поэтому System.exit (1) никогда не будет выполнен, потому что перед ним будет выбрано исключение; но на самом деле get.abort() не имеет проблем с закрытым запросом. – Bambax

 Смежные вопросы

  • Нет связанных вопросов^_^