我可以设置特定管道请求的超时和重试次数吗?

时间:2013-09-04 16:53:52

标签: scala pipeline spray spray-client

使用spray的流水线操作来发出如下的HTTP请求:

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

有没有办法指定请求的超时时间以及它应该针对该特定请求重试的次数?

我发现的所有文档只引用了在配置中进行的操作(即便如此,我似乎无法使其工作)。

THX

2 个答案:

答案 0 :(得分:10)

使用配置文件

我在Akka系统中使用Spray 1.2.0。在我的演员里面,我导入现有的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更改代码中的设置,但您必须定义所有参数。 (基于spray usage example。)

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)

答案 1 :(得分:2)

我认为在代码中覆盖默认超时的最简单方法是使用futureTimeout方法的隐式sendReceive参数。该参数的数据类型为akka.util.Timeout。所以,如果你想要120秒的超时而不是默认的60秒,你可以这样做......

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

但是,我没有看到任何允许您的客户端代码以类似方式更改最大重试次数的参数。