2015-09-30 2 views
0

На API есть:Как таймаут работает в Отправка

val http = Http.configure(_ 
    .setConnectionTimeoutInMs(1) 
) 

Что за это конфиг? Я использую его с:

.setMaxRequestRetry(0) 

Я воевал Я получу неудачное будущее после таймаута. Будущее я создаю так:

val f = http(u OK as.String) 
    f.map { 
    NotificationClientConnectionParams.parseFromString 
    } 

Но вместо отказа я получаю успех задолго после моего таймаута. Как это должно работать?

Мой тест выглядит следующим образом:

val startTime = java.time.LocalTime.now() 
val f = TcpUtil2.registerClientViaDispatch(ClientHeaders("12345", "123456789")) 
f onSuccess { 
    case c => 
    println(s"Success: $c") 
    println(java.time.Duration.between(startTime, java.time.LocalTime.now()).toMillis) 
} 
f onFailure { 
    case e => 
    println(s"failure:${e.getMessage}") 
} 
Thread.sleep(2000) 

Время отклика в сотни миллисекунд, и я получил успех. Это ошибка отправки?

ответ

1

HTTP-туда и обратно проходит через несколько этапов (чрезмерно упрощенный):

  1. установления соединения
  2. соединение установлено
  3. отправки запроса полезной нагрузки
  4. запрос полезной нагрузки послал
  5. ждет полезной нагрузки ответа
  6. Получающая отклик полезная нагрузка
  7. полезной ответ получил

Из того, что я понимаю, что вы измерить время между состояниями 1 и 7.

setConnectionTimeoutInMs приходит из async-http-client, который используется Dispatch внутри. Вот отрывок из its documentation:

Установите максимальное время в миллисекундах AsyncHttpClient может ждать при подключении к удаленному хосту

Таким образом, этот метод устанавливает максимальное время клиента будет ждать между состояниями 1 и 2.

Там также setRequestTimeoutInMs:

Установите максимальное время в миллисекундах асинхронный HttpClient wait at

Этот метод, как представляется, устанавливает время между состояниями 5 и 6 (или 7, я не уверен, какой из них).


Так вот что, вероятно, происходит в вашем случае. Вы подключаетесь к удаленному хосту, сервер принимает соединение очень быстро (время между 1 и 2 является небольшим), поэтому ваш Future не получает сбой.Затем есть несколько вариантов: либо сервер занимает много времени, чтобы подготовить ответ, прежде чем он начнет отправлять его обратно (время между 5 и 6), или ответ очень большой, поэтому требуется много времени для его доставки вам (время между 6 и 7), или и то, и другое. Но поскольку вы не устанавливаете тайм-аут запроса, ваш Future не получает отказ из-за этого.

+0

Есть ли способ отправки тайм-аута между 1 и 7 этапами? –

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