Scala Play Controller中的Finagle客户端

时间:2015-04-15 22:38:05

标签: scala playframework finagle

我在我的控制器中使用Finagle客户端的方法(FinagleClient.longRunningComputation)

def alfa = Action.async(parse.json) { request =>

    val response = FinagleClient.longRunningComputation(request.body )          
    response.map( rest => Ok("Got result: " + rest ))

}

我需要在播放控制器中获取com.twitter.util.Future的结果

我尝试使用Returning futures,但编译器返回以下错误:

found   : com.twitter.util.Future[play.api.mvc.Result]
required: scala.concurrent.Future[play.api.mvc.Result]

response.map(rest => Ok("Got result: " + rest))

我需要在我的播放控制器中使用com.twitter.util.Future

我该怎么做?

1 个答案:

答案 0 :(得分:2)

您必须转换为scala.concurrent.Future,您可以使用Promise进行转换。

这样的事情:

def alfa = Action.async(parse.json) { request =>
    val p = Promise[Result]
    val response = FinagleClient.longRunningComputation(request.body )          
    val twitterFuture = response.map( rest => Ok("Got result: " + rest ))
    twitterFuture.onSuccess(p.success)
    twitterFuture.onFailure(p.failure)

    p.future
}

我们可以将其概括为隐式将com.twitter.util.Future[A]转换为scala.concurrent.Future[A]

import com.twitter.util.{Future => TwitterFuture}
import scala.concurrent.{Future, Promise}

object TwitterConversions {
    def twitter2Scala[A](f: TwitterFuture[A]): Future[A] = {
        val p = Promise[A]
        f.onSuccess(p.success)
        f.onFailure(p.failure)
        p.future
    }
}

然后你需要在你的控制器中做的就是import TwitterConversions._(或你把它放进去的任何包)。