我正在深入研究在我们的Play 2.4应用程序中使用Quartz。
最初,我尝试通过Global
对象初始化所有内容,一切都运行良好。
现在,我试图摆脱Global
利用模块基础设施。
这就是我现在所拥有的。
JobSchedulingService
@Singleton
class JobSchedulingService @Inject()(lifecycle: ApplicationLifecycle) extends ClassLogger{
lazy val schedulerFactory = current.injector.instanceOf[StdSchedulerFactory]
lazy val scheduler = schedulerFactory.getScheduler
/**
* Let's make sure that scheduler shuts down properly
*/
lifecycle.addStopHook{ () =>
Future.successful{
if (scheduler.isStarted) {
scheduler.shutdown(true)
}
}
}
protected def init() : Unit = {
logger.info("Initializing scheduler...")
scheduler.start()
}
init()
}
SchedulerModule - 此处用于初始化上述服务。
class SchedulerModule extends AbstractModule{
override def configure(): Unit = {
bind(classOf[JobSchedulingService]).asEagerSingleton
}
}
在application.conf
我添加了:
play.modules.enabled += "scheduling.modules.SchedulerModule"
看起来相当紧张。但是,当应用程序启动时,我得到一个例外:
2016-03-23 00:07:42,173 INFO s.JobSchedulingService - 初始化 调度程序... 2016-03-23 00:07:42,213错误应用程序 -
! @ 6pfp72mh6 - 内部服务器错误,(GET)[/] - >
play.api.UnexpectedException:意外异常[CreationException: 无法创建进样器,请参阅以下错误:
1)注入构造函数时出错,java.lang.RuntimeException:有 没有开始申请 。scheduling.JobSchedulingService(JobSchedulingService.scala:15) 在 scheduling.modules.SchedulerModule.configure(SchedulerModule.scala:11) (通过模块:com.google.inject.util.Modules $ OverrideModule - > schedu.modules.SchedulerModule)定位时 scheduling.JobSchedulingService
...
问题是,在我们的应用程序中,调度程序基于关闭持久性作业存储,并应在应用程序重新启动时重新启动。再次,当我通过Global
完成时,它完美地运作了。
如何解决这个问题?在启动时初始化实例的正确方法是什么?
谢谢,
答案 0 :(得分:1)
您可能应该使用依赖注入来处理所有事情。注入调度程序,如..
class JobSchedulingService @Inject()(lifecycle: ApplicationLifecycle, schedulerFactory: StdSchedulerFactory) extends ClassLogger{
lazy val scheduler = schedulerFactory.getScheduler
答案 1 :(得分:0)
嗯... 我想我刚解决了。
似乎问题不是类的实际初始化,而是这一行:
lazy val schedulerFactory = current.injector.instanceOf[StdSchedulerFactory]
一旦我改为:
lazy val schedulerFactory = new StdSchedulerFactory
它开始工作了。
可能会对某人有所帮助