gpt4 book ai didi

scala - Finagle 快速启动客户端

转载 作者:可可西里 更新时间:2023-11-01 16:04:32 25 4
gpt4 key购买 nike

我有一个裸 sbt 项目,我添加了 "com.twitter"%% "finagle-http"% "6.33.0"。我正在关注 quickstart 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 0
  1. 为什么不打印没有“modification 2”的响应?
  2. 为什么“modification 1”没有打印出contentString

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

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

最佳答案

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

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

你有这个:

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

即它返回一个新的 future,该 future 返回与旧 future 相同的值,但也执行副作用,而不仅仅是执行副作用。 (作为旁注,在我看来,这是 Twitter future API 优于标准库的众多方式之一——我更喜欢函数参数的返回类型是 Unit 和方法不是)。

你的情况是 Finagle 用于客户端的线程是守护进程,所以如果你没有明确地等待 future 的结果,就不能保证 JVM 在满足 future 之前不会退出.更改您的代码以等待 onSuccess 返回的 future 结果将使一切按预期工作。

关于scala - Finagle 快速启动客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35239239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com