Клиент Finagle в Scala Play Controller

Я использую метод (FinagleClient.longRunningComputation) клиента Finagle в моем контроллере

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 ответ

Решение

Вам придется конвертировать в 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._ (или любой другой пакет, в который вы положили).

Другие вопросы по тегам