当接收到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是否有意义?如果不行,有哪些替代方案?