Finagle快速启动客户端

Eth*_*anP 3 scala http finagle twitter-finagle

我有一个简单的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
}
Run Code Online (Sandbox Code Playgroud)

没有" modification 2"我根本没有输出.随着这一点println,我得到了

needed this
GET success: Response("HTTP/1.1 Status(200)")

Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)
  1. 为什么没有" modification 2" 没有响应打印?
  2. 为什么没有contentString" modification 1" 打印?

如果我在" modification 1" 上设置断点,并resp.contentString使用当前状态进行评估,则会根据需要返回网站的HTML.

如何在程序正常运行时进行打印?

Tra*_*own 8

onSuccessTwitter上方法的签名Future与标准库中的签名不同 - 而不是Future:

def onSuccess[U](pf: PartialFunction[T, U])(implicit executor: ExecutionContext): Unit
Run Code Online (Sandbox Code Playgroud)

你有这个:

def onSuccess(f: (A) ? Unit): Future[A]
Run Code Online (Sandbox Code Playgroud)

即它返回一个新的未来,返回与旧的未来相同的值,但也执行副作用,而不是仅执行副作用.(作为旁注,在我看来,这是Twitter未来API比标准库更好的方式之一 - 我更喜欢函数参数的返回类型Unit和方法不是这样的事实).

在您的情况下发生的事情是Finagle用于客户端的线程是守护进程的,因此如果您没有明确等待未来的结果,则无法保证JVM在满足未来之前不会退出.更改代码以等待返回的未来结果onSuccess将使一切按预期工作.