如何使用Scala/Play 2.3安排复杂任务?
我正在计划每天运行一次,我想要运行的代码包括更新数据库中的条目。通过使用Akka覆盖Global.scala中的onStart方法,我成功地安排了一些简单代码的运行,如下所示如何使用Scala/Play 2.3安排复杂任务?,scala,playframework-2.3,Scala,Playframework 2.3,我正在计划每天运行一次,我想要运行的代码包括更新数据库中的条目。通过使用Akka覆盖Global.scala中的onStart方法,我成功地安排了一些简单代码的运行,如下所示 override def onStart(app: Application) = { Akka.system.scheduler.schedule(0.second, 1.second) { println("hello!") } } 问题是,我想做一些比在这里登录更复杂的事情,我想对数据
override def onStart(app: Application) = {
Akka.system.scheduler.schedule(0.second, 1.second) {
println("hello!")
}
}
问题是,我想做一些比在这里登录更复杂的事情,我想对数据库进行更新,所以我想在模型文件(models/SomeTable.scala)中调用一些函数,但我不能在Global.scala中导入这些代码
听起来,如果我想做更复杂的事情,我应该使用Akka的演员系统,但我还远远不了解它是如何工作的。我已经找到了关于如何通过创建演员的文档,但如何将其纳入我的剧本项目还不清楚。我在哪里写这个Actor类,它是如何导入的(允许Global.scala访问…?)?如果我不需要使用演员来完成这个任务,有没有人对导入和类似的工作在这个剧本项目的这一部分有一些了解
请注意,Play框架的这一部分经历了从Play版本2.3.*到2.4.*的巨大变化,因此不应该期望2.4.*中的解决方案在这里可以工作
我在上面得到的信息主要来自,以及一系列相关的问题:
非常感谢 首先,你肯定需要读一读关于阿克卡的书 但是对于您的特定任务,您不需要将任何内容导入到
Global
。你只需要启动你的工人演员。这个演员可以自己安排常规动作。作为模板
import akka.actor.{Actor, Cancellable, Props}
import scala.concurrent.duration._
class MyActor extends Actor {
private var cancellable: Option[Cancellable] = None
override def preStart(): Unit = {
super.preStart()
cancellable = Some(
context.system.scheduler.schedule(
1.second,
24.hours,
self,
MyActor.Tick
)(context.dispatcher)
)
}
override def postStop(): Unit = {
cancellable.foreach(_.cancel())
cancellable = None
super.postStop()
}
def receive: Receive = {
case MyActor.Tick =>
// here is the start point for your execution
// NEW CODE WILL BE HERE
}
}
object MyActor {
val Name = "my-actor"
def props = Props(new MyActor)
case object Tick
}
这里有一个演员班。使用启动前和停止后(了解更多信息),其中定义并取消了计划。计划的操作正在向self
发送Tick
消息(换句话说,参与者将收到每24小时Tick
消息,如果为Tick
定义了receive
,则将处理此消息)。
所以您只需要从我放置注释的地方开始实现
从Global开始,您只需在onStart
中启动此操作:
Akka.system.actorOf(MyActor.props, MyActor.Name)
谢谢你的帮助!这个演员代码应该写在哪里?任何地方。这只是一门普通的课。我会将它放在播放结构之外的一些常用包中(不在
控制器
、视图
或其他与播放相关的标准包中),例如com.example.myapp.actors,但您可以自由选择任何其他位置