кварц - java.lang.ClassCastException org.quartz.JobDetail нельзя привести к ScheduledJobDetail с JobStoreTX - PullRequest
1 голос
/ 27 июля 2010

Я использую кварц 1.6.5.Недавно я перешел из Quartz Job Store из RamJobStore в org.quartz.impl.jdbcjobstore.JobStoreTX.После этого я начал видеть ClassCastException в моем журнале всякий раз, когда кварц пытается выполнить задание.</p> <pre> 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 </pre> <p> Мои quartz.properties выглядят так: </p> <pre> 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 </pre> <p> Я инициализирую свой планировщик, используя следующий код: org.quartz.Scheduler quartzScheduler = new StdSchedulerFactory("quartz.properties").getScheduler(); Тот же код работает с RAMJobStore, но не с JobStoreTX.Чего мне здесь не хватает?Я включил ведение журнала, и это то, что я нахожу в журналах: </p> <pre> 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 </pre> <p>

Обновление: я пытался сделать то же самое с org.quartz.impl.jdbcjobstore.JobStoreCMT, но проблема все еще сохраняется.

1 Ответ

0 голосов
/ 27 июля 2010

Вероятно, проблема в том, что у вас есть подкласс JobDetail.

Когда вы использовали RAMJobStore, ваши ScheduledJobDetail объекты были бы сохранены в памяти, и поэтому вы можете без проблем откатиться назад из JobDetail.Однако при использовании базы данных JobStore Quartz будет восстанавливать объекты JobDetail самостоятельно, и у него нет возможности узнать, что вы хотите использовать для этого собственный класс, и вы получите исключение.

Даже если бы Quartz знал, что нужно использовать ScheduledJobDetail, он не сможет обработать добавленные вами дополнительные поля.

Подклассы JobDetail - не тот путь.Вам нужно найти какой-то другой способ кодирования этой информации, без подклассов.

...