我可以用Akka开始后台工作(未来)

时间:2015-08-12 14:27:17

标签: scala akka

将Akka用作背景工作者是否合适?

就像我想在数据库中插入一些查询然后向我的用户返回一些内容,但在我想安排一个任务之前,该任务还应将数据索引到另一个不需要回调的数据库中。

示例:

class Worker extends Actor {
    override def receive = {
         case t: Task => 
             Future {
                // do some long running work, which shouldn't affect a user
             }
      }
}

那会有用吗? 如果我一次发送多个任务会怎样?它会立即开始运行它们还是让Actor等到Future成功?

编辑:我还要定义另一个案例,例如案例r:Reindex =>应该重新索引所有对象,有没有办法锁定它,以便它一次只能运行一个reindex? (特别是如果我有多个服务器)

1 个答案:

答案 0 :(得分:1)

它可以工作,但你可以考虑使用不同的执行上下文运行它,如果这个长时间运行的工作真的很长并且阻塞。

Actor不会等到将来成功,但是当你的演员正在使用的执行上下文/调度程序的所有线程被这些长时间运行的任务阻止时,你可能遇到这种情况。

了解更多: http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html http://docs.scala-lang.org/overviews/core/futures.html

关于Reindex:

如果只有这个actor负责重建索引,你可以保留一些状态变量来告诉你当前是否有重建索引。

无法告诉您有关服务器间同步的信息。想到的天真的方式是在DB中存储一些标志,可以从所有服务器访问。