1

我在我的项目中使用调度重启库版本 0.9.5 ( http://dispatch.databinder.net/Dispatch.html )。通过 sbt 我有以下行:

libraryDependencies += "net.databinder.dispatch" %% "dispatch-core" % "0.9.5"

在 scala (2.9.2) repl 中(开始使用sbt console以获取适当的依赖项)并且独立于我的代码,我运行以下会话:

import dispatch._
import java.util.concurrent.TimeUnit._
val spoo = Http.threads(1).waiting( Duration(10, SECONDS ) )

(我相信第三行设置了我自己的线程池,一个线程,超时10秒)。

然后我重复运行此代码(在粘贴模式下),提交未来以获取特定 url,然后打印状态代码(异步):

spoo(url("http://www.evapcool.com/products/commercial/")).either
    .map {
        case Right(r) => println( "S: " + r.getStatusCode())
        case Left(e)  => println( "E: " + e.toString ) }

每次运行此行时,我都会等待打印状态代码,然后再次运行该行。对于前 20 到 40 个调用,它按预期工作。然后它可靠地无法报告成功的页面回复或异常。我的假设是,如果这是由超时引起的,我应该期望回调在 10 秒后触发,其中包含某种形式的超时异常的Left子句。Either但我的经验是,这永远不会发生。

谁能帮我告诉我我做错了什么?

更新

顺便说一句,我知道这里有一个类似的问题(有答案)但我正在寻找官方(即图书馆作者打算)处理超时的方法——在我看来,这就是waiting方法专为

4

1 回答 1

2

所以一个答案,虽然我不太满意 - 因为它涉及忽略相当漂亮的waiting方法Http并直接使用 async-http-client apis 是这样的(受问题更新中链接的 SO 帖子的启发):

val spoo = Http.threads( 1 ).configure
    { builder =>
        builder.setRequestTimeoutInMs( 10000 )
        builder.setConnectionTimeoutInMs( 10000 )

        builder
    }

我的代码现在按预期运行。哼哼……

于 2013-02-10T16:12:39.957 回答