Актер + игровая рамка + скользкий запрос - PullRequest
0 голосов
/ 31 января 2019

Я новичок в akka + playframework.Я использовал метод прямого скользящего запуска в методе асинхронного действия.Метод run (.…) возвращает Future [T].Теперь мой вопрос: можно ли использовать метод ask actor внутри действия play async в контроллере, чтобы выполнить метод slick run?

package controllers

import akka.actor.{ActorRef, ActorSystem, Props}
import akka.pattern.ask
import akka.util.Timeout
import javax.inject.{Inject, Singleton}
import play.api.mvc._
import services.actorServices.TestActor

import scala.concurrent.ExecutionContext
import scala.concurrent.duration._

@Singleton
class ActorTestController @Inject()(cc: ControllerComponents, actorSystem: ActorSystem)(implicit assetsFinder: AssetsFinder, executionContext: ExecutionContext)
  extends AbstractController(cc) {

  val testActor: ActorRef = actorSystem.actorOf(Props[TestActor])
  implicit val timeout: Timeout = Timeout.apply(2 second)


  def test: Action[AnyContent] =Action.async{
    (testActor ? "test").mapTo[String].map(string => Ok(string))
  }

}


package services.actorServices

import akka.actor.Actor
import services.dbServices.HomePageDAO

import scala.concurrent.ExecutionContext.Implicits.global


class TestActor extends Actor {

  override def receive: Receive = {
    case "test" =>
      HomePageDAO.getSlogan.map { seqOfString =>
        sender() ! seqOfString.head
      }

  }
}




На самом деле ask не работает с методом, который вычисляется в будущем :(

1 Ответ

0 голосов
/ 01 февраля 2019

Нет.Вы не хотите делать это:

HomePageDAO.getSlogan.map { seqOfString =>
        sender() ! seqOfString.head
      }

«отправитель» может измениться (на самом деле, вероятно, так и будет), пока Future не завершится.Что вы можете сделать, это использовать pipeTo и ответить отправителю, когда Future завершит свою работу.

HomePageDAO.getSlogan pipeTo sender()

Личное мнение: Актер в этом случае излишен.Тебе это не нужно.Просто используйте HomePageDAO вместо ActorTestController.

...