2011-07-12 6 views
14

ロードバランサの背後に同じアプリケーションサーバーのレイヤーがあります。操作上の理由から、私は両方のアプリケーションサーバーのアプリケーション構成が同一でなければならないという制約があり、ノードを簡単に追加および削除できるようになっています。すべてのアプリケーションサーバーは同じデータベースを共有します。アプリケーションサーバーはクラスタ化されていません。Quartzを使用して複数のステートレスアプリケーションサーバー間でシングルジョブをスケジュールする

これまではうまくいきましたが、今ではアプリのサーバーの1つで実行されるスケジュールされた仕事をしたいと思います。すべてのアプリケーションサーバーはQuartzを実行し、ジョブの実行スケジュールは同じです。トリガーはすべてのアプリサーバーで起動しますが、実際には1つのアプリケーションサーバーだけがジョブを実行するようにしたいと考えています。ここでのアイデアは、アプリケーションサーバーを失った場合、代わりに別のアプリケーションサーバーを実行し、新しいアプリケーションサーバーを追加すると、実行中のジョブで順番に処理されるということです。

私は、すべてのアプリケーションサーバーがジョブを開始する前に読んで、ジョブが「ロックされていない」場合にのみ起動するデータベースに「ジョブロック」テーブルを作成することでこれを計画していました。最初にテーブルを更新するアプリケーションサーバーは、テーブルを実行中の状態に更新するか、ジョブの最後にテーブルをリセットすることによって、他のユーザーを本質的にブロックします。

私はこれをビルドする前に、私はクォーツのより多くの経験を持つものの中からいくつかの入力をいただければと思います:それはあたり仕事に行われる必要がないように

A)私はクォーツにこの動作をフックすることができます基礎?私。開発者は抽象化されているため、ジョブのロックを心配することなく新しいジョブを追加できます。

b)Quartzは、上記と同様の機能を実現するための組み込みのメカニズムを提供していますので、自分でロールする必要はありませんか?

ありがとうございます!

答えて

18

あなたはこれがうまくいくと思いますか?リンク

クラスタリングから http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering

抜粋は、現在のみJDBC-Jobstore(JobStoreTX又はJobStoreCMT)で動作し、本質的に、クラスタ共有の各ノードに同じデータベースを有することによって動作します。

ロードバランシングは自動的に実行され、クラスタの各ノードはできるだけ早くジョブを実行します。トリガの発射時間が発生すると、それを取得する最初のノードが(それにロックをかけることによって)ノードを発火させます。

+0

どのように私がそれを逃したのか分かりません:/ありがとう。 – Scruffers

+0

私の答えが役に立つ場合は、「受け入れられた回答」としてマークすることを忘れないでください。 – Sap

+0

Quartzを使用したクラスタリングは、クラスタ化された環境のためのものです。 –

関連する問題