我相信新的阿卡+ playframework。我一直在使用中发挥作用的异步方法直接华而不实的run方法。 run(。…)方法返回Future [T]。现在的问题是 - ?不会是好到播放异步操作中使用的演员问法在控制器执行华而不实的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
}
}
}
实际上问不适用于Future中的计算方法:(
答案 0 :(得分:0)
不。您不想这样做:
HomePageDAO.getSlogan.map { seqOfString =>
sender() ! seqOfString.head
}
“发件人”可能会更改(实际上可能会更改),直到Future完成。您可以做的是使用pipeTo
并在Future完成时回复发件人。
HomePageDAO.getSlogan pipeTo sender()
个人观点:在这种情况下,演员是多余的。不用了只需在HomePageDAO
中使用ActorTestController
。