我有一个简单的sbt项目,其中添加了"com.twitter" %% "finagle-http" % "6.33.0"。我正在遵循快速启动指南的Twitter Finagle。我拥有的代码是一个直接复制粘贴:
import com.twitter.finagle.{Http, Service}
import com.twitter.finagle.http
import com.twitter.util.{Await, Future}
object Client extends App {
val client: Service[http.Request, http.Response] = Http.newService("www.scala-lang.org:80")
val request = http.Request(http.Method.Get, "/")
request.host = "www.scala-lang.org"
val response: Future[http.Response] = client(request)
response.onSuccess { resp: http.Response =>
println("GET success: " + resp)
println(resp.contentString) // modification 1
}
Await.ready(response)
println("needed this") // modification 2
}没有"modification 2“,我就根本得不到输出。加上那个println,我得到了
needed this
GET success: Response("HTTP/1.1 Status(200)")
Process finished with exit code 0modification 2“的响应打印?contentString”中打印出来的modification 1?如果我在"modification 1“上设置了一个断点,并使用当前状态计算resp.contentString,则会按需要返回网站的resp.contentString。
当程序正常运行时,我如何将它打印出来?
发布于 2016-02-06 10:46:55
onSuccess方法在Twitter的Future上的签名与标准库的Future-instead上的签名不同:
def onSuccess[U](pf: PartialFunction[T, U])(implicit executor: ExecutionContext): Unit你有这个:
def onSuccess(f: (A) ⇒ Unit): Future[A]也就是说,它返回一个新的未来,返回与旧的未来相同的值,但也执行一个副作用,而不是仅仅执行副作用。(顺便说一句,我认为这是Twitter未来API优于标准库的许多方法之一--我更喜欢函数参数的返回类型是Unit,而方法的返回类型不是)。
在您的情况下,用于客户端的线程Finagle将被守护,因此,如果您不显式地等待未来的结果,就不能保证JVM在满足未来之前不会退出。更改您的代码以等待onSuccess返回的未来的结果,将使一切按预期工作。
https://stackoverflow.com/questions/35239239
复制相似问题