我使用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的节俭客户?我觉得我错过了一些明显的东西。
答案 0 :(得分:6)
据我所知,当您使用自动Thrift.newIface[Iface]
方法创建服务时,您无法关闭它,因为您的代码唯一知道的结果值是它符合{ {1}}。如果您需要关闭它,您可以分两步实例化您的客户端,在一个中创建Thrift服务,并在另一个中调整它到您的界面。
如果你使用Scrooge生成你的Thrift界面,它的外观如下:
Iface
我在repl中尝试了这个,它对我有用。这是一个轻微编辑的成绩单:
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())
这不是太糟糕,但我希望有一种更好的方式,我还不知道。
答案 1 :(得分: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)
}