【问题标题】:Actor + playframework + slick queryActor + playframework + slick 查询
【发布时间】:2023-12-29 06:09:02
【问题描述】:

我是 akka + playframework 的新手。我一直在 play async action 方法中使用直接 slick run 方法。 run(. ... ) 方法返回 Future[T]。现在我的问题是 - 可以在控制器的 play 异步操作中使用 actor ask 方法来执行 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 不适用于 Future 计算的方法:(

【问题讨论】:

    标签: playframework akka slick


    【解决方案1】:

    没有。你不想这样做:

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

    "sender" 可能会改变(实际上,它可能会)直到 Future 完成。您可以做的是使用pipeTo 并在 Future 完成时回复发件人。

    HomePageDAO.getSlogan pipeTo sender()
    

    个人意见:这种情况下演员是多余的。你不需要它。只需在ActorTestController 中使用HomePageDAO

    【讨论】:

    • 感谢您的帮助-它正在工作。我也在想“在这种情况下演员是多余的”。