gpt4 book ai didi

Scala + Play Framework + Slick + Akka - 来自 Akka Actor 的数据库访问

转载 作者:行者123 更新时间:2023-12-05 00:17:08 25 4
gpt4 key购买 nike

在收到 TCP 特定消息时,我需要查询我的数据库。为此,我创建了一个名为 DBActor 的 Actor,它被加载到 Application.scala 中。文件

    class Application @Inject() (system: ActorSystem) extends Controller {

val tcpServer = system.actorOf(Props[TCPServer], "tcpserver")
val dbActor = system.actorOf(Props[DBActor], "dbActor")
}

Tcp 服务器是接收到消息的参与者,需要将其推送到 DB Actor 上
      val handler = context.actorSelection("/dbActor")

DB actor 就是这样初始化的,根据 Play Framework 规范
    object DBActor {
def props() =
Props(classOf[DBActor])
}


class DBActor @Inject() (protected val dbConfigProvider:
DatabaseConfigProvider) extends Actor
with HasDatabaseConfigProvider[JdbcProfile]
with ActorLogging
with TableComponent {

import akka.io.Tcp._
import driver.api._

val table = TableQuery[Table]

def receive: Receive = {
case GetConfig(id) => {
sender ! Await.result(db.run(table.filter(_.id=== id).result.headOption),
Duration.Inf)
.map { x => x.config }
}
}
}

目前,由于错误,actor没有被构造
    Error injecting constructor, java.lang.IllegalArgumentException: 
no matching constructor found on class tcp.DBActor for arguments []
at controllers.Application.<init>(Application.scala:17)
at controllers.Application.class(Application.scala:17)

所以我需要一种方法来在 DBactor 中注入(inject)数据库配置以查询数据库或替代方法。在此之前我评估过注入(inject) DAO 或将我需要的 DAO 转换为 Actor ,都失败了。

此时的问题是,让参与者访问数据库或至少是 Controller 是否有意义?如果做不到,有什么替代方案?

最佳答案

你需要的是一个注入(inject)的 Actor 。完整的描述可以在 Play 文档 (https://www.playframework.com/documentation/2.5.x/ScalaAkka#Dependency-injecting-actors) 中找到,但这里是它的要点:

您可以像这样定义参与者绑定(bind):

bindActor[DBActor]("db-actor")

并像这样在 Controller 中注入(inject) Actor :
class Application @Inject() (@Named("db-actor") dbActor: ActorRef) extends Controller {

另一方面,您应该避免 Await.result只要有可能。在您的场景中,这可能很容易替换为:
val senderRef = sender()
db.run(table.filter(_.id=== id).result.headOption)
.map(res => senderRef ! res.config)

请注意,sender ref 是之前存储的,因为它在 map 中不再有效。 (参见 sender() 方法的 scaladoc)。

关于Scala + Play Framework + Slick + Akka - 来自 Akka Actor 的数据库访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40804275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com