【发布时间】:2016-06-12 06:01:22
【问题描述】:
我在播放应用程序服务器启动时启动的调度程序有问题,但是一旦应用程序关闭,它就会命中以下代码部分:
// firstDay something like 1 = monday
private void startScheduler(final ImageService imageService,
final ActorSystem system) {
startImagesCleanupScheduler(imageService, system);
Logger.info("Schedulers started");
}
我的问题是Runnable 块立即开始执行而不是取消任务。
澄清代码:
以下方法启动Scheduler:
private void startImagesCleanupScheduler(ImageService imageService, ActorSystem system) {
system.scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay
Duration.create(1, TimeUnit.DAYS), //Frequency 1 days
() -> {
int rows = imageService.cleanupInactiveImages();
Logger.info(String.format("%d inactive unused images cleaned from db", rows));
},
system.dispatcher()
);
}
我关机时的日志请注意这里的第一行:
[info] - application - 1 inactive unused images cleaned from db
[info] - application - Shutting down connection pool.
[info] - application - Creating Pool for datasource 'default'
...
[info] - application - Schedulers started
[info] - play.api.Play - Application started (Prod)
您可以看到它执行调度程序时忽略了原来的执行时间,然后关闭,然后启动,之后“调度程序启动”。
什么问题,我如何取消调度程序或阻止播放在关机前运行它?这是 Akka 的错误吗?
我在OnStartup 内打电话给startScheduler,就像以下问题的答案一样:
java Playframework GlobalSettings deprecation for onStart
编辑: 以下是重现问题的最少代码:
首先创建OnStartup类:
@Singleton
public class OnStartup {
@Inject
public OnStartup(final ActorSystem system) {
startScheduler(system);
}
private void startScheduler(final ActorSystem system) {
startImagesCleanupScheduler(system);
Logger.info("Schedulers started");
}
private void startImagesCleanupScheduler(ActorSystem system) {
system.scheduler().schedule(
Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay
Duration.create(1, TimeUnit.DAYS), //Frequency 1 days
() -> {
//int rows = imageService.cleanupInactiveImages();
rows = 1;
Logger.info(String.format("%d inactive unused images cleaned from db", rows ));
},
system.dispatcher()
);
}
}
然后创建模块:
public class OnStartupModule extends AbstractModule {
@Override
public void configure() {
bind(OnStartup.class).asEagerSingleton();
}
}
最后在 application.conf 中启用模块:
play.modules.enabled += "modules.OnStartupModule"
【问题讨论】:
-
您能否也发布用于启动此计划的代码,以防万一,因为这看起来没问题?
-
已经发过问题你可以参考stackoverflow.com/questions/35842293/…在启动时创建,然后看这里的代码,只需要打印日志,注释掉服务调用
-
@AleksandarStojadinovic 我提供了简单的代码
-
目前我只看到您不需要
@Singleton注释,因为您正在模块中配置它。这意味着它被延迟实例化,而模块将其声明为渴望。我不相信这是原因,因为我不知道注释和模块之间的优先级,但试试吧。 -
我试过了,但似乎是它的 Akka 系统问题,看看这个:doc.akka.io/docs/akka/current/scala/…,所以我现在正在寻找一种解决方法。
标签: java playframework akka playframework-2.5