Şu anda Play 2.4 uygulamasında Quartz kullanarak kazıyorum. Başlangıçta, her şeyi Global
nesnesiyle başlatmaya çalıştım ve her şey mükemmel çalıştı.Başlangıçta çalışan uygulamayı çalıştıran hizmet sınıfı başlatılıyor ile ilgili sorunlar (play 2.4/scala)
Şimdi, Global
modülleri altyapısından yararlanmaya çalışıyorum. Şimdiye kadar sahip olduğum şeyler.
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 - Burada yukarıda hizmetin başlatılmasını.
class SchedulerModule extends AbstractModule{
override def configure(): Unit = {
bind(classOf[JobSchedulingService]).asEagerSingleton
}
}
Ve application.conf
yılında
play.modules.enabled += "scheduling.modules.SchedulerModule"
İleri doğru oldukça boğaz görünüyor. Ancak, uygulama başladığında bir istisna alıyorum zaman:
2016-03-23 00: 07: 42.173 INFO s.JobSchedulingService - zamanlayıcı başlatılıyor ... 2016/03/23 00: 07: 42.213 HATA uygulama -
! @ 6pfp72mh6 - iç sunucu hatası, (GET) [/] için ->
play.api.UnexpectedException: beklenmeyen özel durum [CreationException: Aşağıdaki hatalar bkz enjektörü oluşturulamadı:
1) hata enjekte yapıcı, java.lang.RuntimeException: diye bir şey yok scheduling.JobSchedulingService de uygulamayı başlatan (JobSchedulingService.scala: 15). scheduling.modules.SchedulerModule.configure (SchedulerModule.scala: 11) de (modüller vasıtasıyla: com'i bulurken .google.inject.util.Modules $ OverrideModule -> scheduling.modules.SchedulerModule)scheduling.JobSchedulingService şey bizim app, zamanlayıcı kapalı kalıcılık iş depolama dayanır ve ne zaman başvuru yeniden başlatıldığında yeniden başlatmanız gerekir
.... Yine,
Global
aracılığıyla yaptığımda, mükemmel çalıştı.
Bu soruna nasıl girebilirim? Bir örneği başlangıçta başlatmanın doğru yolu nedir?
sayesinde
zamanlayıcı enjekte Ama bu yaptığını tam olarak ne: 'current.injector.instanceOf [StdSchedulerFactory]'. Ve uygulama tam olarak başlatılmadan önce tam olarak ne işe yaramazsa budur. –
Bu aslında işe yaradı. O zaman, bunun nasıl çalıştığını tam olarak anladığımdan emin değilim. Ama yardım için teşekkürler. –