Scala + Play框架 + Slick + Akka - Akka Actor中的数据库访问

4

当接收到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")

根据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 }
        }
      }
    }

目前,由于错误,演员未被构建。

    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中以查询数据库,或者使用其他替代方法。之前我尝试注入DAO或将所需的DAO转换为actor,但都失败了。

现在的问题是,将访问数据库或控制器的权限给予actor是否有意义?如果不行,有哪些替代方案?

1个回答

6
你需要的是一个注入的actor。完整的描述可以在play文档中找到(https://www.playframework.com/documentation/2.5.x/ScalaAkka#Dependency-injecting-actors),但这里是要点:
你可以像这样定义actor绑定:
bindActor[DBActor]("db-actor")

然后像这样在控制器中注入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)

请注意,发送方引用在之前已被存储,因为它在map内不再有效(请参阅sender()方法的scaladoc)。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接