Нестатический метод в классе отправляет запрос 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
относится к одному экземпляру; как возможно, чтобы таймер, исходящий из предыдущего экземпляра, прервал получение, принадлежащее другому экземпляру?
System.exit (1); будет отклонять все ваше приложение. – dinesh707
Да, это то, чего мы хотим; если у нас есть тайм-аут по любому запросу, это почти наверняка означает, что сервер не работает. И поэтому мы не хотим продолжать программу, потому что это приведет к отправке большего количества запросов на сервер, который отключен. Нам нужно позвонить кому-нибудь, чтобы вернуть сервер. – Bambax
Вы когда-нибудь отменяете таймер после ответа, которого хотите? – arcy