我想发送光滑的表作为akka actor消息的一部分。这样,另一端的远程actor可以连接到数据库,并可以在mysql数据库上进行CRUD操作。我无法理解光滑的类型,我发现编译器/日食抱怨。我怎样才能做到这一点。将光滑的查询作为演员消息的一部分传递是一个好主意。
object RemoteActorMessages {
case class Create(table: Table[A])
case class RunQuery(query: Query[_, _, _])
case Result(code: Int, message: String)
}
class DBActor extends Actor {
def recieve = {
case Create(table) => createTable(table)
case RunQuery(query) => runQuery(query)
case ... //so on
}
}
def createTable(table: Table[M]): Future[A] = Future {
db.withSession(implicit session => tableQuery[table].ddl.create)
}
def runQuery(query: Query[_, _, _]): Future[A] = Future {
db.withSession { implicit session => {
query.run
}
}
}
警告:代码可能有一些类型错误。观众可以理解分散
我对如何将结果发送回邮件的发件人感到困惑。例如:query.list.run返回模型对象列表。那么,我应该如何通过Result消息构建
答案 0 :(得分:0)
我认为这是一个例子,当你有一把锤子时,一切都变成了指甲。我认为这不是演员的正确用例。一个原因(不是唯一的一个)就是数据库操作“慢”。并且他们会长时间阻止演员线程。
可以说,您需要一个管理表操作的服务,使用Futures和自定义执行上下文来隔离影响(例如,在Play中完成like this)。类似的东西:
object DBService {
def createTable() : Future[Boolean] = ???
...
}
参与者只应接收CreateTable
之类的命令,然后调用服务中的相应方法。
顺便说一句,这会简化您的用例,因为服务可以更多地了解表格和其他Slick细节,而演员可能会忘记它们。
不是唯一的方法,但可以说更简单。