gpt4 book ai didi

scala - 我如何关闭 Finagle Thrift 客户端?

转载 作者:行者123 更新时间:2023-12-01 09:52:45 25 4
gpt4 key购买 nike

我正在使用 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 thrift 客户端?我觉得我错过了一些明显的东西。

最佳答案

据我所知,当您使用自动Thrift.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

这还不算太糟糕,但我希望有一个我还不知道的更好的方法。

关于scala - 我如何关闭 Finagle Thrift 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34780815/

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