Scala播放调度程序与Actors进行后台作业

时间:2017-02-21 02:46:52

标签: scala playframework akka

我是Scala和Play框架的新手,我正试图弄清楚如何使用后台工作。

我发现基本上有两种安排工作的方法:创建一个Actor,或安排一个异步任务。

我想问一个建议,什么方式更好?我发现Actors非常复杂,很多样板代码,我不想编写更多的代码来触发动作而不是实际的动作代码。

以下是我如何使用调度程序的示例。

def send(purchase: Purchase): Unit = 
  system.scheduler.scheduleOnce(100.milliseconds) {
    execute(purchase)
  }

def execute(purchase: Purchase): Unit = {
  ... send email ...
  ... calculate stuff and write to DB ...
}

与上面的代码相比,如果使用Actors,我首先要声明一个Actor:

object ConfiguredActor {
  case object GetConfig
}
class ConfiguredActor @Inject() (configuration: Configuration) extends Actor {
  ...
}

然后绑定它

class MyModule extends AbstractModule with AkkaGuiceSupport {
  def configure = {
    bindActor[ConfiguredActor]("configured-actor")
  }
}

然后注入并使用它

class Application @Inject() (@Named("configured-actor") configuredActor: ActorRef)
                            (implicit ec: ExecutionContext) extends Controller {

  def getConfig = Action.async {
    (configuredActor ? GetConfig).mapTo[String].map { message =>
      Ok(message)
    }
  }
}

还有child actors的概念,我无法理解何时使用它。

文档没有明确说明何时应该使用每种方法。我觉得Scheduler更适合使用即发即弃的任务,而且当需要响应时,Actors会更好。但我不确定。

Scheduler和Actor的最佳实践和示例用例是什么?

0 个答案:

没有答案