初始化服务类的问题,它依赖于在启动时运行应用程序(播放2.4 / scala)

时间:2016-03-23 00:30:47

标签: scala playframework quartz-scheduler

我正在深入研究在我们的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完成时,它完美地运作了。

如何解决这个问题?在启动时初始化实例的正确方法是什么?

谢谢,

2 个答案:

答案 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

它开始工作了。

可能会对某人有所帮助