2016-03-23 13 views
0

Ş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

ekledim:

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

cevap

1

birileri yardımcı olacaktır olabilir. .. gibi

class JobSchedulingService @Inject()(lifecycle: ApplicationLifecycle, schedulerFactory: StdSchedulerFactory) extends ClassLogger{ 
    lazy val scheduler = schedulerFactory.getScheduler 
+0

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. –

+0

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. –

0

Hmmm ... Ben sadece bunu çözüme düşünüyorum.Sorun bir sınıfın gerçek başlatma değilmiş gibi

Öyle görünüyor, ancak bu satırı:

lazy val schedulerFactory = new StdSchedulerFactory 

o çalışmaya başladı:

lazy val schedulerFactory = current.injector.instanceOf[StdSchedulerFactory] 

ben olarak değiştirdim bir kez.

o Muhtemelen her şey için bağımlılık enjeksiyon kullanarak olmalıdır