2017-06-07 6 views
0

スケジューリングジョブにQuartzを使用するJavaアプリケーションがあります。 quartzのバージョンは次のとおりです。quartz-2.2.1データベース接続エラー時に再起動するQuartz Scheduler

クォーツの構成では、JDBCジョブストアが使用されています。データベース接続が石英スケジューラオブジェクト上のstartメソッドを呼び出した時に(による断続的なネットワーク障害のために)ダウンしている場合

、それが次の例外で失敗します

2017-05-28 00:05:45 org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.JobPersistenceException: Couldn't recover jobs: The connection is closed. [See nested exception: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.]] 
2017-05-28 00:05:45  at org.quartz.impl.jdbcjobstore.JobStoreSupport.schedulerStarted(JobStoreSupport.java:692) 
2017-05-28 00:05:45  at org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:567) 
2017-05-28 00:05:45  at org.quartz.impl.StdScheduler.start(StdScheduler.java:142) 

その石英スケジューラを確保するためにコードが再試行され、1秒ごとにquartzスケジューラオブジェクトのstartメソッドが呼び出されました。しかし、データベース接続が確立すると、quartzスケジューラーの開始メソッドの呼び出しは成功します(例外は発生しません)。しかし、データベースにある関連トリガーは開始されず、ジョブもトリガーされません。

何が問題なのでしょうか?いかなる援助も感謝しなければならない。ここで

は、石英の構成である、あなたがjob misfiresに問題がある可能性があります

#============================================================================ 
# Configure Main Scheduler Properties 
#============================================================================ 

org.quartz.scheduler.instanceName = TestScheduler 
org.quartz.scheduler.instanceId = AUTO 
org.quartz.scheduler.skipUpdateCheck=true 

#============================================================================ 
# Configure ThreadPool 
#============================================================================ 

org.quartz.threadPool.class =  org.quartz.simpl.SimpleThreadPool 
org.quartz.threadPool.threadCount = 50 
org.quartz.threadPool.threadPriority = 5 

#============================================================================ 
# Configure JobStore 
#============================================================================ 

org.quartz.jobStore.misfireThreshold = 60000 
org.quartz.jobStore.maxMisfiresToHandleAtATime = 15 

org.quartz.jobStore.class =  org.quartz.impl.jdbcjobstore.JobStoreTX 
org.quartz.jobStore.driverDelegateClass =  org.quartz.impl.jdbcjobstore.StdJDBCDelegate 
org.quartz.jobStore.useProperties = false 
org.quartz.jobStore.dataSource = aBPM 
org.quartz.jobStore.tablePrefix = ABPM_ 
org.quartz.jobStore.isClustered = false 
org.quartz.jobStore.useDBLocks = false 
org.quartz.jobStore.acquireTriggersWithinLock = true 

#============================================================================ 
# Configure Datasources 
#============================================================================ 
org.quartz.dataSource.aBPM.driver = org.hsqldb.jdbcDriver 
org.quartz.dataSource.aBPM.URL = jdbc:hsqldb:file:embeddedDb/db/abpmquartz 
org.quartz.dataSource.aBPM.user = sa 
org.quartz.dataSource.aBPM.encryptPassword = yes 
org.quartz.dataSource.aBPM.password = fMFVvEFk3gFmM9ewWQkTNg== 
org.quartz.dataSource.aBPM.maxConnections = 55 
org.quartz.dataSource.aBPM.validationQuery= SELECT 1 
+0

こんにちはアマン、この質問を投稿してから約2ヶ月が経過しており、私はそれに答えました。私の答えが助けになることがわかったら、それを受け入れたもの(投票矢印の下にある小切手)としてマークすることをお勧めします。ありがとう! – walen

答えて

0

(による断続的なネットワーク障害への)私たちはすでに安っぽい接続を処理するために検証クエリーを有効にしていることに注意してください。

TL; DR:トリガーを構築するときに適切な失火指示を使用するか、またはmisfireThresholdを増やしてください。


スケジューラはそれが失火だ、トリガーが発動することになった時点でダウンしていた場合。スケジューラが起動すると、Quartzは失効したジョブをチェックし、それらの処理方法を探します。すぐに実行しますか?次の予定されている火の時間まで待つ? 対処方法を知らせるには、misfire instructionsを明示的に指定するか、デフォルトのQuartzのスマートポリシーに設定します。これはトリガーの種類によって異なります(CronTriggerのデフォルトの失火ポリシーはSimpleTriggerと異なります)。

悲しいことに、Quartzの料理本は、失火の説明については不足しています。詳細を知りたい場合は、TriggerサブクラスごとにJavaDocをチェックするように指示します。
あなたの便宜のため、この1人のユーザーがall misfire instructions and default misfire policies explainedというブログエントリを書いています。

使用しているトリガーの種類は教えてくれませんでしたが、には、withMisfireHandlingInstructionFireNow()のようなミスファイヤーの指示が含まれていて、スケジューラーが起動するとすぐにジョブが実行されます。


にスケジューラを起動するために必要なものよりも高い値org.quartz.jobStore.misfireThresholdを設定する別のオプションがされています。
今は1分に設定されています。これは、予想される火災時間より1分遅れたより小さいを発射したすべての仕事は失火とみなされず、うまく動作することを意味します。しかし、1分以上遅れていたジョブの場合、Quartzはそれらの間違ったポリシーをチェックします。

スケジューラがオンラインになるまでに5分もかかりません。 org.quartz.jobStore.misfireThreshold = 300000を設定しようとするかもしれません。そのため、スケジューラーの起動時にジョブが起動すると、Quartzはそれらが5分未満で終了したことを認識し、失火ポリシーを最初にチェックすることなく実行させます。

関連する問題