在 Play Framework 2 中调度异步任务。5.X (Java)
Scheduling asynchronus tasks in PlayFramework 2.5.X (Java)
我们有一个使用 PlayFramework 2.5.4 和 MongoDB 的 Play 项目。我们希望每天更新我们的数据库。目前,我们每次收到请求时都会检查时间,并在一天结束时更新。
这会导致一些问题:
- 当前玩家需要安静等待很长时间才能完成请求
- 可能有一天没有更新(但我们希望每天更新一次,即使没有任何变化)
- 我们必须修改我们插入的每个请求。
所以我已经找到了 AKKA 的文档和旧的 Whosebug 问题(比如 How to schedule task daily + onStart() in Play 2.0.4?)。但解决方案不再有效。
Akka.system().scheduler()
已弃用
system.scheduler()
出现编译错误 (from docu),我不知道是缺少导入还是其他什么。
据我所知,您应该从 2.4 版开始使用 @inject,但我无法找到有关如何按计划使用它或毕竟如何使用它的适当示例
实际上我想做的就是每天在同一时间调用 PlayerDBHandler.newDay()。
感谢帮助
没有看到编译错误,我猜 system
没有定义。扩展文档中的示例,类似这样的东西应该可以工作。
public class SchedulingTask {
@Inject
public SchedulingTask(final ActorSystem system,
@Named("update-db-actor") ActorRef updateDbActor) {
system.scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay
Duration.create(1, TimeUnit.DAYS), //Frequency
updateDbActor,
"update",
system.dispatcher(),
null);
}
}
system
注入,也可以注入actor的引用。或者,您可以从 system
.
中查找演员参考
一旦你调整它来做你想做的事,在模块中声明 SchedulingTask
。
package com.example;
import com.google.inject.AbstractModule;
import play.libs.akka.AkkaGuiceSupport;
public class MyModule extends AbstractModule implements AkkaGuiceSupport {
@Override
protected void configure() {
bindActor(UpdateDbActor.class, "update-db-actor");
bind(SchedulingTask.class).asEagerSingleton();
}
}
最后,更新您的应用程序 conf 以启用该模块。
play.modules.enabled += "com.example.MyModule"
我们有一个使用 PlayFramework 2.5.4 和 MongoDB 的 Play 项目。我们希望每天更新我们的数据库。目前,我们每次收到请求时都会检查时间,并在一天结束时更新。 这会导致一些问题:
- 当前玩家需要安静等待很长时间才能完成请求
- 可能有一天没有更新(但我们希望每天更新一次,即使没有任何变化)
- 我们必须修改我们插入的每个请求。
所以我已经找到了 AKKA 的文档和旧的 Whosebug 问题(比如 How to schedule task daily + onStart() in Play 2.0.4?)。但解决方案不再有效。
Akka.system().scheduler()
已弃用
system.scheduler()
出现编译错误 (from docu),我不知道是缺少导入还是其他什么。 据我所知,您应该从 2.4 版开始使用 @inject,但我无法找到有关如何按计划使用它或毕竟如何使用它的适当示例
实际上我想做的就是每天在同一时间调用 PlayerDBHandler.newDay()。
感谢帮助
没有看到编译错误,我猜 system
没有定义。扩展文档中的示例,类似这样的东西应该可以工作。
public class SchedulingTask {
@Inject
public SchedulingTask(final ActorSystem system,
@Named("update-db-actor") ActorRef updateDbActor) {
system.scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay
Duration.create(1, TimeUnit.DAYS), //Frequency
updateDbActor,
"update",
system.dispatcher(),
null);
}
}
system
注入,也可以注入actor的引用。或者,您可以从 system
.
一旦你调整它来做你想做的事,在模块中声明 SchedulingTask
。
package com.example;
import com.google.inject.AbstractModule;
import play.libs.akka.AkkaGuiceSupport;
public class MyModule extends AbstractModule implements AkkaGuiceSupport {
@Override
protected void configure() {
bindActor(UpdateDbActor.class, "update-db-actor");
bind(SchedulingTask.class).asEagerSingleton();
}
}
最后,更新您的应用程序 conf 以启用该模块。
play.modules.enabled += "com.example.MyModule"