【问题标题】:Finagle client in Scala Play ControllerScala Play 控制器中的 Finagle 客户端
【发布时间】:2015-06-22 02:49:12
【问题描述】:

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

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

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

}

我需要在我的 play Controller 中获取 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

我该怎么做?

【问题讨论】:

    标签: scala playframework finagle


    【解决方案1】:

    您必须转换为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._(或您放入的任何包)。

    【讨论】:

    • Twitter 的双射库中有officially supported converters
    • @TravisBrown,我得到了下一个错误:找到:com.twitter.util.Future[org.jboss.netty.handler.codec.http.HttpResponse],需要:scala.concurrent.ExecutionContext, val futureScala = twitter2ScalaFuture( FinagleClient.documentSearch( json ) ),我的代码在这里:github.com/hectorgool/es-client/blob/master/app/controllers/…
    • @user1034380 使用正确的导入(参见双射自述文件),您可以编写例如Future(1).as[scala.concurrent.Future[Int]]。或者,您可以创建一个双射实例,然后直接调用它。
    猜你喜欢
    • 2016-05-16
    • 2017-09-09
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    相关资源
    最近更新 更多