私のGrailsプロジェクト( grails 2.2.1 )でクォーツ(プラグイン:quartz2:2.1.6.2ですが、プラグイン:quartz:1.0-RC7でもテストしましたが、問題は変わりません)に問題があります。
こんなお仕事してます
class MyJob {
def concurrent = false
def execute(context){
try {
//....
// works with domains .....
myDomain.save(flush: true)
// works with domains .....
//....
sessionFactory.currentSession.flush()
} catch (org.springframework.dao.OptimisticLockingFailureException olfe) {
println "Job failed by database exception "
} catch ( org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException ole){
println "Job failed by database exception "
} catch ( org.hibernate.HibernateException hibe ){
println "Job failed by database exception "
}
}
}
}
execute メソッドで StaleObjectStateException が発生することがあります。これは私のロジックでは問題ありません。私は grails の楽観的ロックを使用しており、この例外は週に 1 回しか発生しません。
問題は、この例外が発生すると、ジョブが再び起動しなくなることです。
メソッドコードをtry catchでラップし、休止状態セッションを内部でフラッシュして、例外をキャプチャしようとしましたが、幸運はありませんでした。例外は、私のキャッチのいずれによってもキャプチャされません。
オンラインで調べてみると、これは古い Grails Quartz のバグであることがわかりましたが、修正されています。いずれにせよ、try{}catch を使用してバグを回避する必要があります。
PSジョブは、このタイプの呼び出しによってブートストラップからスケジュールされます
MyJob.schedule( 10000L )
スケジューリングを停止する例外は
[194949896] core.ErrorLogger Unable to notify JobListener(s) of Job that was executed: (error will be ignored). trigger= DEFAULT.MT_3tbn6lewgiqa3 job= DEFAULT.MyJob
org.quartz.SchedulerException: JobListener 'persistenceContextJobListener' threw exception: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [MyDomain#42] [See nested exception: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [MyDomain#42]]
at org.quartz.core.QuartzScheduler.notifyJobListenersWasExecuted(QuartzScheduler.java:1939)
at org.quartz.core.JobRunShell.notifyJobListenersComplete(JobRunShell.java:361)
at org.quartz.core.JobRunShell.run(JobRunShell.java:235)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [MyDomain#42]
at grails.plugin.quartz2.PersistenceContextJobListener.jobWasExecuted(PersistenceContextJobListener.groovy:46)
at org.quartz.core.QuartzScheduler.notifyJobListenersWasExecuted(QuartzScheduler.java:1937)
... 3 more
.....
events.PatchedDefaultFlushEventListener Could not synchronize database state with session
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [MyJob#42]
at MyJob.execute(MyJob.groovy:354)
at grails.plugin.quartz2.GrailsArtefactJob.execute(GrailsArtefactJob.java:57)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)