2010-07-27 5 views
1

J'utilise le quartz 1.6.5. Je suis récemment passé de Quartz Job Store de RamJobStore à org.quartz.impl.jdbcjobstore.JobStoreTX. Depuis lors, j'ai commencé à voir ClassCastException dans mon journal chaque fois que quartz essaie d'exécuter un travail. quartz - java.lang.ClassCastException org.quartz.JobDetail ne peut pas être converti en ScheduledJobDetail avec JobStoreTX

 
Jul 26, 2010 3:10:00 AM org.quartz.core.ErrorLogger schedulerError 
SEVERE: Job (group52.52 threw an exception. 
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.ClassCastException: org.quartz.JobDetail cannot be cast to ScheduledJobDetail] 
     at org.quartz.core.JobRunShell.run(JobRunShell.java:213) 
     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525) 
Caused by: java.lang.ClassCastException: org.quartz.JobDetail cannot be cast to ScheduledJobDetail 
     at ScheduledJob.execute(ScheduledJob.java:150) 
     at org.quartz.core.JobRunShell.run(JobRunShell.java:202) 
     ... 1 more 

Mon quartz.properties ressemble:

 
org.quartz.scheduler.instanceName = DefaultQuartzScheduler 
org.quartz.scheduler.rmi.export = false 
org.quartz.scheduler.rmi.proxy = false 
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false 
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 
org.quartz.threadPool.threadCount = 10 
org.quartz.threadPool.threadPriority = 5 
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true 
org.quartz.jobStore.misfireThreshold = 60000 
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate 
org.quartz.jobStore.tablePrefix = QRTZ_ 
org.quartz.jobStore.dataSource = myDS 
org.quartz.dataSource.dsjta.jndiURL=myDs 
org.quartz.jobStore.useProperties=true 

j'initialiser mon planificateur en utilisant le code suivant: org.quartz.Scheduler quartzScheduler = new StdSchedulerFactory("quartz.properties").getScheduler(); Le même code fonctionne avec un RAMJobStore mais pas avec un JobStoreTX. Que pourrais-je manquer ici? Je permis l'exploitation forestière et c'est ce que je trouve dans les journaux:

 
136672 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.impl.jdbcjobstore.SimpleSemaphore - Lock 'TRIGGER_ACCESS' is desired by: DefaultQuartzScheduler_QuartzSchedulerThread 
136672 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.impl.jdbcjobstore.SimpleSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: DefaultQuartzScheduler_QuartzSchedulerThread 
136672 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.impl.jdbcjobstore.SimpleSemaphore - Lock 'TRIGGER_ACCESS' given to: DefaultQuartzScheduler_QuartzSchedulerThread 
136703 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.impl.jdbcjobstore.SimpleSemaphore - Lock 'TRIGGER_ACCESS' retuned by: DefaultQuartzScheduler_QuartzSchedulerThread 
136703 [DefaultQuartzScheduler_QuartzSchedulerThread] DEBUG org.quartz.simpl.SimpleJobFactory - Producing instance of Job 'group152.152', class=ScheduledJob 
136703 [DefaultQuartzScheduler_Worker-3] DEBUG org.quartz.core.JobRunShell - Calling execute on job group152.152 
136703 [DefaultQuartzScheduler_Worker-3] ERROR org.quartz.core.JobRunShell - Job group152.152 threw an unhandled Exception: 
java.lang.ClassCastException: org.quartz.JobDetail cannot be cast to ScheduledJobDetail 
     at ScheduledJob.execute(SchedulerQuartzImpl.java:150) 
     at org.quartz.core.JobRunShell.run(JobRunShell.java:216) 
     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549) 
136703 [DefaultQuartzScheduler_Worker-3] ERROR org.quartz.core.ErrorLogger - Job (group152.152 threw an exception. 
org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.ClassCastException: org.quartz.JobDetail cannot be cast to ScheduledJobDetail] 
     at org.quartz.core.JobRunShell.run(JobRunShell.java:227) 
     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549) 
Caused by: java.lang.ClassCastException: org.quartz.JobDetail cannot be cast to ScheduledJobDetail 
     at ScheduledJob.execute(SchedulerQuartzImpl.java:150) 
     at org.quartz.core.JobRunShell.run(JobRunShell.java:216) 
     ... 1 more 
136703 [DefaultQuartzScheduler_Worker-3] DEBUG org.quartz.impl.jdbcjobstore.SimpleSemaphore - Lock 'TRIGGER_ACCESS' is desired by: DefaultQuartzScheduler_Worker-3 
136703 [DefaultQuartzScheduler_Worker-3] DEBUG org.quartz.impl.jdbcjobstore.SimpleSemaphore - Lock 'TRIGGER_ACCESS' is being obtained: DefaultQuartzScheduler_Worker-3 

Mise à jour: J'ai essayé la même chose avec org.quartz.impl.jdbcjobstore.JobStoreCMT et toujours le même problème persiste.

+0

Qu'est-ce que 'ScheduledJobDetail'? Il n'y a pas de telle classe dans l'API Quartz. – skaffman

+0

ScheduledJobDetail est une classe que nous avons écrite qui prolonge org.quartz.JobDetail et ajoute quelques champs pour notre commodité. – Venkat

Répondre

0

Le problème est susceptible d'être que vous avez sous-classé JobDetail. Lorsque vous avez utilisé RAMJobStore, vos objets ScheduledJobDetail ont été conservés en mémoire et vous pouvez donc les renvoyer sans aucun problème depuis JobDetail. Lorsque vous utilisez une base de données JobStore, cependant, Quartz va reconstruire les objets JobDetail lui-même, et il n'a aucun moyen de savoir que vous voulez utiliser une classe personnalisée pour cela, et ainsi vous obtenez l'exception.

Même si Quartz savait utiliser un ScheduledJobDetail, il n'aurait aucun moyen de gérer les champs supplémentaires que vous avez ajoutés.

Sous-classement JobDetail n'est pas le chemin à parcourir. Vous devez trouver une autre façon de coder cette information, sans sous-classe.

Questions connexes