кварц — java.lang.ClassCastException org.quartz.JobDetail нельзя преобразовать в ScheduledJobDetail с помощью JobStoreTX

Я использую кварц 1.6.5. Недавно я перешел из магазина вакансий Quartz из RamJobStore в org.quartz.impl.jdbcjobstore.JobStoreTX. С тех пор я начал видеть ClassCastException в своем журнале всякий раз, когда кварц пытается запустить задание.

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

Мои кварц.свойства выглядят следующим образом:

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

Я инициализирую свой планировщик, используя следующий код: org.quartz.Scheduler quartzScheduler = new StdSchedulerFactory("quartz.properties").getScheduler(); Тот же самый код работает с RAMJobStore, но не с JobStoreTX. Что я мог пропустить здесь? Я включил ведение журнала, и вот что я нахожу в журналах:

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

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


person Venkat    schedule 27.07.2010    source источник
comment
Что такое ScheduledJobDetail? В Quartz API такого класса нет.   -  person skaffman    schedule 27.07.2010
comment
ScheduledJobDetail — это написанный нами класс, который расширяет org.quartz.JobDetail и добавляет несколько полей для нашего удобства.   -  person Venkat    schedule 27.07.2010


Ответы (1)


Проблема, скорее всего, в том, что вы создали подкласс JobDetail.

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

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

Создание подкласса JobDetail — не лучший вариант. Вам нужно найти другой способ кодирования этой информации без создания подклассов.

person skaffman    schedule 27.07.2010