我是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的最佳实践和示例用例是什么?