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

При использовании конвейерной обработки спрея для выполнения HTTP-запроса следующим образом:

val urlpipeline = sendReceive ~> unmarshal[String]
urlpipeline { Get(url) }

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

Вся документация, которую я нашел, только ссылки делает в конфиге (и даже тогда я не могу заставить его работать).

спасибо


person Scott Smith    schedule 04.09.2013    source источник
comment
Какая версия спрея? В последних версиях вы можете использовать его, как описано здесь: spray.io/documentation/ 1.1-M8/спрей-клиент. См. пример с HostConnectorSetup. Один параметр HostConnectorSetup является параметром настроек (не показан в примере).   -  person jrudolph    schedule 04.09.2013


Ответы (2)


С файлом конфигурации

Я использую Spray 1.2.0 в системе Akka. Внутри моего актера я импортирую существующую систему Akka, поэтому я могу использовать файл конфигурации Akka по умолчанию.

implicit val system = context.system
import context.dispatcher
val pipeline: HttpRequest => Future[HttpResponse] = sendReceive

Теперь вы можете изменить конфигурацию в application.conf.

spray.can.host-connector {
    max-connections = 10
    max-retries = 3
    max-redirects = 0
    pipelining = off
    idle-timeout = 30 s
    client = ${spray.can.client}
}

В коде

Можно изменить настройки в коде с помощью HostConnectorSetup, но вы должны определить все параметры. (На основе примера использования спрея.)

val pipeline: Future[SendReceive] =
for (
  Http.HostConnectorInfo(connector, _) <-
  IO(Http) ? Http.HostConnectorSetup("www.spray.io", port = 80, settings = Some(new HostConnectorSettings(maxConnections = 3, maxRetries = 3, maxRedirects = 0, pipelining = false, idleTimeout = 5 seconds, connectionSettings = ClientConnectionSettings(...))))
) yield sendReceive(connector)
person Tim Van Laer    schedule 06.03.2014

Я считаю, что самый простой способ переопределить тайм-аут по умолчанию в коде — это использовать неявный аргумент futureTimeout для метода sendReceive. Тип данных этого параметра — akka.util.Timeout. Итак, если вам нужен тайм-аут 120 секунд вместо 60 секунд по умолчанию, вы можете сделать это...

implicit val timeout = Timeout(120 seconds)
val urlpipeline = sendReceive ~> unmarshal[String]
urlpipeline { Get(url) }

Однако я не вижу никакого параметра, который позволил бы вашему клиентскому коду изменить максимальное количество повторных попыток аналогичным образом.

person Daryl Odnert    schedule 12.11.2014
comment
Кроме того, я нашел эту статью очень полезной — kamon.io/teamblog/2014/11/02/ - person Daryl Odnert; 12.11.2014
comment
/ ! \ Это не влияет на время ожидания соединения, это влияет только на время ожидания запроса, вызывая возбуждение исключения, если указанное время ожидания достигнуто - базовое соединение не будет отменено. См. приведенную выше ссылку Дэрила. - person Chironex; 17.05.2016