6

クォーツ2.1.4を使用してJavaスケジューラジョブを実行している本番環境。4台のマシンと1つのスケジュールジョブのみが1つのクラスタノード(ノード1)で通常数か月間実行されるweblogicクラスタサーバーでは、ノード2は、ノード1が昨夜実行中のジョブの引き継ぎに失敗したことを突然見つけました。実際、ノード1はエラーなしで(サーバー、ネットワーク、データベース、アプリケーションログによると)、このイベントにより、2つのプロセスの同時実行が原因で重複メッセージが作成されました。

ノードの障害を検出するクォーツのメカニズムは何ですか?pingスキャン、またはUCPブロードキャストを介したハートビートping、またはデータベースの応答時間などによって?その上の構成はありますか?

クォーツ構成ガイド http://quartz-scheduler.org/documentation/quartz-2.1.x/configuration/ConfigJDBCJobStoreClusteringを読みました が、答えがありません。

JDBCJobstoreを使用しています。詳細を確認したところ、異常な長さ(5秒から30秒)で実行されているデータベース(Oracle)ステートメントがあることがわかりました。事件はこの時期に起こった。あなたはそれが関連していると思いますか?

私の設定は

`org.quartz.threadPool.threadCount = 10

org.quartz.threadPool.threadPriority = 5

org.quartz.jobStore.misfireThreshold = 10000

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX `

誰かがこの情報を持っていますか?ありがとう。

4

1 に答える 1

4

答えが非常に遅いことは知っていますが、おそらく私たちの両方のような誰かがそれを必要とするでしょう。

短いバージョン:すべてDBによって処理されます。重要なプロパティはorg.quartz.jobStore.clusterCheckinIntervalになります。

ロングバージョン(すべてのクレジットはhttp://flylib.com/books/en/2.65.1.91/1/に移動します):

失敗したスケジューラノードの検出

スケジューラインスタンスがチェックインルーチンを実行すると、予定されていたときにチェックインしなかった他のスケジューラインスタンスがあるかどうかを確認します。これは、SCHEDULER_STATEテーブルを検査し、プロパティorg.quartz.jobStore.clusterCheckinInterval(次のセクションで説明)よりも古い値がLAST_CHECK_TIME列にあるスケジューラーを探すことによって行われます。1つ以上のノードがチェックインしていない場合、実行中のスケジューラーは他のインスタンスに障害が発生したと見なします。

さらに、次の段落も重要になる可能性があります。

非同期クロックを使用して別々のマシンでノードを実行する

これまでに確認できるように、異なるマシンでノードを実行していて、クロックが同期されていない場合、予期しない結果が生じる可能性があります。これは、あるノードが最後にチェックインした時刻を他のインスタンスに通知するためにタイムスタンプが使用されているためです。そのノードのクロックが将来に設定されている場合、実行中のスケジューラはノードがダウンしたことを認識しない可能性があります。一方、あるノードのクロックが過去に設定されている場合、ノードはノードがダウンしたと見なし、ジョブを引き継いで再実行しようとする可能性があります。どちらの場合でも、それはあなたが望む振る舞いではありません。クラスタ内で異なるマシンを使用している場合(これは通常のケースです)、必ずクロックを同期させてください。これを行う方法の詳細については、この章で後述する「QuartzClusteringCookbook」のセクションを参照してください。

于 2017-02-21T11:08:04.710 に答える