3

我正在使用 scrooge + thrift 来生成我的服务器和客户端代码。到目前为止一切正常。

这是我如何使用客户端的简化示例:

private lazy val client =
  Thrift.newIface[MyPingService[Future]](s"$host:$port")

def main(args: Array[String]): Unit = {
  logger.info("ping!")
  client.ping().foreach { _ =>
    logger.info("pong!")
    // TODO: close client
    sys.exit(0)
  }
}

一切正常,但是当程序退出时服务器会抱怨未关闭的连接。我已经查看了所有内容,但似乎无法弄清楚如何关闭client实例。

所以我的问题是,你如何关闭 Finagle 节俭客户端?我觉得我错过了一些明显的东西。

4

2 回答 2

7

据我所知,当您使用 automagicThrift.newIface[Iface]方法创建服务时,您无法关闭它,因为您的代码唯一知道结果值的是它符合Iface. 如果您需要关闭它,您可以分两步实例化您的客户端,一个是创建 Thrift 服务,另一个是使其适应您的界面。

如果您使用 Scrooge 生成 Thrift 界面,它的外观如下:

val serviceFactory: ServiceFactory[ThriftClientRequest,Array[Byte]] =
  Thrift.newClient(s"$host:$port")

val client: MyPingService[Future] =
  new MyPingService.FinagledClient(serviceFactory.toService)

doStuff(client).ensure(serviceFactory.close())

我在repl中试过这个,它对我有用。这是一个经过轻微编辑的成绩单:

scala> val serviceFactory = Thrift.newClient(...)
serviceFactory: ServiceFactory[ThriftClientRequest,Array[Byte]] = <function1>

scala> val tweetService = new TweetService.FinagledClient(serviceFactory.toService)
tweetService: TweetService.FinagledClient = TweetService$FinagledClient@20ef6b76

scala> Await.result(tweetService.getTweets(GetTweetsRequest(Seq(20))))
res7: Seq[GetTweetResult] = ... "just setting up my twttr" ...

scala> serviceFactory.close
res8: Future[Unit] = ConstFuture(Return(()))

scala> Await.result(tweetService.getTweets(GetTweetsRequest(Seq(20))))
com.twitter.finagle.ServiceClosedException

这还不错,但我希望有更好的方法,我还不知道。

于 2016-01-16T08:19:21.413 回答
0

我没有使用过finagle,但根据Finagle文档

val product = client().flatMap { service =>
  // `service` is checked out from the pool.
  service(QueryRequest("SELECT 5*5 AS `product`")) map {
    case rs: ResultSet => rs.rows.map(processRow)
    case _ => Seq.empty
  } ensure {
    // put `service` back into the pool.
    service.close()
  }
}

你不能采取类似的策略吗

client.ping().foreach { service =>
    logger.info("pong!")
    // TODO: close client
    service.close()
    sys.exit(0)
  }
于 2016-01-16T07:26:33.357 回答