首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Finagle快速启动客户端

Finagle快速启动客户端
EN

Stack Overflow用户
提问于 2016-02-06 09:04:13
回答 1查看 694关注 0票数 3

我有一个简单的sbt项目,其中添加了"com.twitter" %% "finagle-http" % "6.33.0"。我正在遵循快速启动指南的Twitter Finagle。我拥有的代码是一个直接复制粘贴:

代码语言:javascript
复制
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,我得到了

代码语言:javascript
复制
needed this
GET success: Response("HTTP/1.1 Status(200)")

Process finished with exit code 0
  1. 为什么没有"modification 2“的响应打印?
  2. 为什么没有从“contentString”中打印出来的modification 1

如果我在"modification 1“上设置了一个断点,并使用当前状态计算resp.contentString,则会按需要返回网站的resp.contentString

当程序正常运行时,我如何将它打印出来?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-06 10:46:55

onSuccess方法在Twitter的Future上的签名与标准库的Future-instead上的签名不同:

代码语言:javascript
复制
def onSuccess[U](pf: PartialFunction[T, U])(implicit executor: ExecutionContext): Unit

你有这个:

代码语言:javascript
复制
def onSuccess(f: (A) ⇒ Unit): Future[A]

也就是说,它返回一个新的未来,返回与旧的未来相同的值,但也执行一个副作用,而不是仅仅执行副作用。(顺便说一句,我认为这是Twitter未来API优于标准库的许多方法之一--我更喜欢函数参数的返回类型是Unit,而方法的返回类型不是)。

在您的情况下,用于客户端的线程Finagle将被守护,因此,如果您不显式地等待未来的结果,就不能保证JVM在满足未来之前不会退出。更改您的代码以等待onSuccess返回的未来的结果,将使一切按预期工作。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35239239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档