Grails 1.0.4 アプリケーションを 1.1.1 にアップグレードしました。アップグレード後、Quartz ジョブを実行すると例外が繰り返し発生します (Quartz プラグイン 0.4.1 を使用)。プラグインは、サービスを介して Simple および Cron Triggers を使用してジョブを手動でスケジュールするために使用されます (以下の言い換えコード)。
class SchedulerService implements InitializingBean
{
static scope = 'singleton'
...
def schedule(def batch) {
JobDetail job = new JobDetail(uniqueId, groupName, BatchJob.class, false, false, true)
job.jobDataMap.put("batchId", batch.id)
SimpleTrigger trigger = new SimpleTrigger(triggerId, triggerGroup, 0)
SchedulerFactory factory = new SchedulerFactory()
factory.initialize(properties)
Scheduler scheduler = factory.getScheduler()
scheduler.scheduleJob(job, trigger)
}
...
}
私の BatchJob ジョブは次のように設定されています。
class BatchJob implements Job, InterruptableJob
{
static triggers = {}
void execute(JobExecutionContext context) {
def batch = Batch.get(context.jobDetail.jobDataMap.getLongValue("batchId"))
// the next line is "line 49" from the stack trace below
def foo = batch.batchStatus.description
}
}
Batch.groovy (ドメイン) の簡略化された定義は次のとおりです。
class Batch
{
BatchStatus batchStatus // relationship
}
ただし、schedulerService.schedule()
既存の保存されたバッチで呼び出されると、次の例外が発生します。
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:86)
at org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsHibernateUtil.unwrapProxy(GrailsHibernateUtil.java:311)
at org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsHibernateUtil$unwrapProxy.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)
...
<b>at BatchJob.execute(BatchJob.groovy:49)</b>
...
これを修正するために次のアクションを試みましたが、どれもうまくいきませんでした:
static fetchMode = [batchStatus: 'eager']
Batch ドメイン クラスで指定しましたstatic mapping = { columns { batchStatus lazy:false }}
Batchドメインクラスで使用しました- ジョブ
batch.attach()
を呼び出した後に使用してみましたBatch.get()
BatchJob.triggerNow()
これはいくつかの例の 1 つにすぎないため、このインスタンスでは使用できません。他のものはサービスによってスケジュールされていますが、cron ジョブまたはその他の方法でスケジュールされている可能性があります。Grails をアップグレードするときに、Quartz プラグインもアップグレードしたことは言及しておく必要があります。以前の Quartz バージョンは 0.4.1-SNAPSHOT でした (アップグレードされたバージョンでは 0.4.1 だけでした)。
これらの手動でトリガーされた Quartz ジョブで Hibernate セッションを正しく動作させるにはどうすればよいですか?
私はこの質問を grails-user メーリング リストにも送信しました。このようなよりニッチな問題については、メーリング リストがもう少し多くの反応を引き出しているようです。そこから出てきた場合は、この質問を回答で更新します。ここにリンクがあります。