Scala+;播放框架+;光滑的+;Akka-从Akka Actor访问数据库

Scala+;播放框架+;光滑的+;Akka-从Akka Actor访问数据库,scala,playframework,akka,slick,Scala,Playframework,Akka,Slick,在接收TCP特定消息时,我需要查询我的数据库。为此,我创建了一个名为DBActor的Actor,并将其加载到Application.scala文件中 class Application @Inject() (system: ActorSystem) extends Controller { val tcpServer = system.actorOf(Props[TCPServer], "tcpserver") val dbActor = system.acto

在接收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参与者上

      val handler = context.actorSelection("/dbActor")
根据Play框架规范,DB actor是以这种方式初始化的

    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)
注入构造函数java.lang.IllegalArgumentException时出错:
在类tcp.DBActor上找不到参数[]的匹配构造函数
at controllers.Application.(Application.scala:17)
at controllers.Application.class(Application.scala:17)
因此,我需要一种在DBactor中插入db配置的方法,以便查询数据库或其他选择。在此之前,我评估了注入DAO或将所需的DAO转换为参与者,两者都失败了


现在的问题是,让参与者访问db或者至少是控制器有意义吗?如果做不到,还有什么选择?

你需要的是一个注入式演员。完整的描述可以在play文档()中找到,但要点如下:

您可以这样定义参与者绑定:

bindActor[DBActor]("db-actor")
并将参与者注入控制器,如下所示:

class Application @Inject() (@Named("db-actor") dbActor: ActorRef) extends Controller {
另一方面,应尽可能避免
wait.result
。在您的场景中,这可能很容易被以下内容取代:

val senderRef = sender()
db.run(table.filter(_.id=== id).result.headOption)
  .map(res => senderRef ! res.config)

请注意,sender ref以前存储过,因为它在
映射中不再有效(请参见
sender()
方法的scaladoc)。

好的,它确实有效,我必须以这种方式注册应用程序的所有参与者。谢谢