2016-05-15 5 views
1

У меня есть клиент Джерси и вы хотите выполнить повторную попытку после SocketTimeoutException, что является ошибкой, которую я вижу в журнале сервера. Скелет кода находится ниже. webtarget - это экземпляр javax.ws.rs.client.WebTarget с URL-адресом и параметрами запроса, которые уже определены. Проблема, с которой я сталкиваюсь, заключается в том, что webtarget.request.get() никогда не выбрасывает исключение SocketTimeoutException, поэтому я не могу это исключить. Любые мысли о том, как я могу реально выполнить повтор?java Джерси запрос повторения на SocketTimeoutException

int i = 0; 
Response response; 
while (true) { 
    try { 
     response = webtarget.request().get(); 
     break; 
    } catch (SocketTimeoutException e){ 
     if (i < retryNumber) { 
      i++; 
     } else { 
      // throws some exception 
     } 
    } 
} 
+0

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

ответ

2

Я в конечном итоге выяснил решение. Оказывается, SocketTimeoutException отображается в ProcessingException, который фактически выбрасывается клиентом Джерси. Таким образом, следующий код работал

int i = 0; 
Response response; 
while (true) { 
    try { 
     response = webtarget.request().get(); 
     break; 
    } catch (ProcessingException e){ 
     if (e.getCause() instanceof SocketTimeoutException && i < retryNumber) { 
      i++; 
     } else { 
      // throws some exception 
     } 
    } 
} 
0

Это не имеет смысла. Сервер выбрасывает SocketTimeoutException, а также ловит его и записывает в журнал и возвращает код ошибки HTTP клиенту. Он не может выдать исключение клиенту.

Необходимо проверить, какой код ошибки HTTP возвращен, и повторить попытку при этом условии.

+0

Почему вы предполагаете, что исключение может быть выбрано только на сервере? –

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