2015-09-29 2 views
0

Я пытаюсь получить самый простой пример работы кварца, работающего в Scala.Как запланировать работу кварца с scala

configure() запускается один раз, когда мой модуль загружен.

lazy val quartz = StdSchedulerFactory.getDefaultScheduler 

override def configure() = { 
    val Job = new Job { 
    override def execute(jobExecutionContext: JobExecutionContext) = { 
     println("Event") 
    } 
    } 

    val job = JobBuilder.newJob(Job.getClass) 
    .withIdentity("Job", "Group") 
    .build 

    val trigger: Trigger = TriggerBuilder 
    .newTrigger 
    .withIdentity("Trigger", "Group") 
    .withSchedule(
     CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) 
    .build 

    quartz.start 
    quartz.scheduleJob(job, trigger) 
} 

Однако при запуске этого кода появляется сообщение об ошибке.

2015-09-29 15:27:05,015 [DefaultQuartzScheduler_QuartzSchedulerThread] ERROR 
org.quartz.core.ErrorLogger - An error occured instantiating job to be executed. job= 'Group.Job' 
org.quartz.SchedulerException: Problem instantiating class 'com.search.binder.SearchModule$$anon$1' 
    at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:58) ~[quartz-2.2.1.jar:na] 
    at org.quartz.simpl.PropertySettingJobFactory.newJob(PropertySettingJobFactory.java:69) ~[quartz-2.2.1.jar:na] 
    at org.quartz.core.JobRunShell.initialize(JobRunShell.java:127) ~[quartz-2.2.1.jar:na] 
    at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:375) [quartz-2.2.1.jar:na] 
Caused by: java.lang.InstantiationException: com.search.binder.SearchModule$$anon$1 
    at java.lang.Class.newInstance(Class.java:427) ~[na:1.8.0_45] 
    at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:56) ~[quartz-2.2.1.jar:na] 
    ... 3 common frames omitted 
Caused by: java.lang.NoSuchMethodException: com.search.binder.SearchModule$$anon$1.<init>() 
    at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_45] 
    at java.lang.Class.newInstance(Class.java:412) ~[na:1.8.0_45] 
    ... 4 common frames omitted 

У кого-нибудь есть «как можно более простой» пример планировщика кварца, работающего в Scala?

+1

Ваш код работает правильно при вставке в объект 'MyMain расширяет App {...}', я думаю, что проблема в 'Configure () запускается один раз, когда мой модуль загружается'. Вы должны написать, как вы вызываете 'configure()'. – ymonad

+1

И вот код, который я тестировал. http://pastebin.com/ySWikJqR – ymonad

ответ

3

Я думаю, что проблема заключается в том, что кварц пытается создать экземпляр нового экземпляра Job, но он не может найти его конструктор, потому что класс, который вы проходите через Job.getClass, является анонимным классом. Попробуйте определив его следующим образом:

class MyJob extends Job { 
    override def execute(jobExecutionContext: JobExecutionContext) = { 
    println("Event") 
    } 
} 

И потом:

val job = JobBuilder.newJob(classOf[MyJob]) 
    .withIdentity("Job", "Group") 
    .build 
+0

Пробовал это - та же ошибка. Также попытался переключиться на lazy val quartz = new StdSchedulerFactory(). GetScheduler –

+0

Кажется странным для меня, что это не сработало, я нашел то же самое и в модуле квартета play2: https://github.com/mchv/play2-quartz /blob/master/app/utils/QuartzScheduler.scala#L46 –

+0

Хорошо, если я это сделаю, а затем я возьму этот класс MyJob за пределами функции configure() (переместите его на корневой уровень), тогда он будет работать. Поэтому java не нравится, что класс объявляется внутри функции configure. Я отмечу это как ответ. –

Смежные вопросы