据我所知,当您使用 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
这还不错,但我希望有更好的方法,我还不知道。