Quartz を使用してジョブをスケジュールするアプリケーションがあります。ジョブ関連のメタデータを永続化するために JDBCJobstore を使用します。
これまでは Quartz.properties で定義されたデータソースを使用していました。しかし、今後の要件に従って、quartz.properties からデータソースを移動し、SchedulerFactoryBean データソース プロパティの一部として提供することを計画しています。
org.springframework.scheduling.quartz.SchedulerFactoryBean
SchedulerFactoryBean のドキュメントによると:
永続的なジョブを使用する場合、Spring 管理 (またはプレーン JTA) トランザクション内のスケジューラですべての操作を実行することを強くお勧めします。そうしないと、データベースのロックが適切に機能せず、破損する可能性さえあります
そしてそのデータソースプロパティのドキュメントには次のように書かれています:
したがって、Spring 管理 (またはプレーン JTA) トランザクション内のスケジューラですべての操作を実行することを強くお勧めします。そうしないと、データベースのロックが適切に機能せず、破損する可能性さえあります
まあ、私の場合は壊れています。「 Spring 管理 (またはプレーン JTA) トランザクション内のスケジューラですべての操作を実行する」というドキュメントの正確な意味。
私たちが提供したデータソースは、他の場所では使用されていません。Quartz.properties は次のようになります。
org.quartz.scheduler.instanceName = JobScheduler
org.quartz.scheduler.instanceId = pcmlScheduler
org.quartz.plugin.shutdownHook.class=org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownHook.cleanShutdown = true
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 2
org.quartz.threadPool.threadPriority = 4
org.quartz.jobStore.misfireThreshold = 5000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
トランザクションが正確に何を参照しているかのコンテキストを取得できれば、データベース ロック BreaK をさらにゼロにすることができます。
Failure obtaining db row lock: No row exists in table QRTZ_LOCKS for lock named: TRIGGER_ACCESS [See nested exception: java.sql.SQLException: No row exists in table QRTZ_LOCKS for lock named: TRIGGER_ACCESS]
QRTZ_LOCKS に行がないのは事実ですが、それを管理するにはすべてクォーツの頭痛の種になるはずです。そして、データソースが Quartz.properties で提供されている場合、それはうまく管理されており、完全に機能しています。
更新: Quartzフォーラムから、この質問の複製を入手しました。提案に従って、次の行を QRTZ_LOCKS に追加すると問題が解決します。
INSERT INTO QRTZ_LOCKS values('TRIGGER_ACCESS');
INSERT INTO QRTZ_LOCKS values('JOB_ACCESS');
INSERT INTO QRTZ_LOCKS values('CALENDAR_ACCESS');
INSERT INTO QRTZ_LOCKS values('STATE_ACCESS');
INSERT INTO QRTZ_LOCKS values('MISFIRE_ACCESS');
これがどれほど信頼できるかはわかりませんが、うまくいきました。興味深い観察は、データソースを quary.properties の一部として提供したときに、これらの行が予期されていなかったということです。しかし、スケジューラーファクトリービーンの一部としてデータソースを提供するには、これらが必要です(おそらく)。理想的には、必要になったとしてもクォーツ自体で手入れをするべきだった。
クォーツのインサイダー/ユーザーからの専門家のコメントが必要です。