2012-10-19 8 views
5

私の実稼働環境では、quartz 2.1.4を使用してJavaスケジューラージョブが実行されています。 1台のクラスタノード(ノード1)で通常数ヶ月間実行されますが、ノード2は突然ノード1が実行中のジョブを引き継ぐ際に失敗します。実際には、ノード1はエラーなし(サーバー、ネットワーク、データベース、アプリケーションログに従って)、このイベントは2つのプロセスの同時実行によって作成された重複メッセージを引き起こしました。石英検出ノードの失敗方法

ノードを検出するためのクォーツのメカニズムは何ですか? pingスキャン、またはUCPブロードキャストによるハートビートping、またはデータベースの応答時間を他の方法で行うには?その上の任意の構成ですか?

私は石英設定ガイド http://quartz-scheduler.org/documentation/quartz-2.1.x/configuration/ConfigJDBCJobStoreClustering を読んでいますが、答えはありません。

私はJDBCJobstoreを使用しています。詳細を確認した後、異常なlong(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 `

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

答えて

2

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

短いバージョン:すべて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つまたは複数のノードがチェックインしていない場合、実行中の スケジューラは、他のインスタンスが失敗したとみなします。

さらに次の段落も重要かもしれません:あなたは別のマシン上のノードを実行する場合は、今では確認することができたよう

は、非同期クロック

と別々のマシン上のノードを実行すると、 クロックが同期していないと、予期しない結果が発生する可能性があります。タイムスタンプを使用して、最後に のノードがチェックインされたことを通知しているためです。 のノードクロックが設定されている場合、実行中のスケジューラは、ノードが になったことを認識できません。一方、1つのノードのクロックが過去に設定されている場合、 ノードはノードがダウンしたとみなし、 を引き継ぎ、そのジョブを再実行しようとします。いずれの場合でも、あなたがしているのはあなたの行動ではない です。クラスタ内の別のマシン(通常のケースである )を使用している場合は、必ずクロックを同期させてください。 の詳細については、この章の後半の 「Quartz Clustering Cookbook」を参照してください。

関連する問題