【问题标题】:Finagle quickstart clientFinagle 快速入门客户端
【发布时间】:2016-05-16 07:42:07
【问题描述】:

我有一个裸 sbt 项目,我添加了 "com.twitter" %% "finagle-http" % "6.33.0"。我正在关注 Twitter Finagle 的 quickstart 指南。我的代码是直接复制粘贴:

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 0
  1. 为什么不打印没有“modification 2”的响应?
  2. 为什么“modification 1”没有打印出contentString

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

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

【问题讨论】:

    标签: scala http finagle twitter-finagle


    【解决方案1】:

    Twitter 的 Future 上的 onSuccess 方法的签名与标准库的 Future 上的签名不同——而不是这样:

    def onSuccess[U](pf: PartialFunction[T, U])(implicit executor: ExecutionContext): Unit
    

    你有这个:

    def onSuccess(f: (A) ⇒ Unit): Future[A]
    

    即它返回一个新的未来,它返回与旧未来相同的值,但也会执行副作用,而不仅仅是执行副作用。 (附带说明一下,在我看来,这是 Twitter 未来 API 优于标准库的众多方式之一——我更喜欢函数参数的返回类型是 Unit 而方法不是这样的事实) .

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

    【讨论】:

    • 谢谢特拉维斯!我认为这是快速入门中的一个错误,因此令人困惑。我会解决的。
    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 2020-06-27
    • 1970-01-01
    • 2020-03-29
    • 2021-03-15
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    相关资源
    最近更新 更多