テラコッタの人たちにとって不公平であることは知っていますが、クラスター化された環境でスケジュールされたジョブを使用するためにHazelcastを使用しようとした人はいますか?
私がイメージできる最も単純な実装は、次のアーキテクチャです。
- 1 つのサーバーのみが Quartz 構成を起動するようにするためのグローバル Hazelcast ロック。
- 実際のタスクを DistributedTask として実行します。(これは後で行うことができます。現時点では、重いスケジュールされたタスクが DistributedTask のトリガーを処理する必要があります)
- ロックを保持しているサーバーがダウンするとすぐに、別のサーバーがロックを取得します。
テラコッタのものを常に開いて開発環境全体の面倒を必要としないため、これはすでにヘーゼルキャストを持っている人にとって大きな利点になると思います.
今のところ、Quartz トリガーの実行を担当するノードを 1 つだけ作成する最も単純なソリューションをコーディングしました。私は Cron のようなトリガーしか使用しないので、負荷の高いトリガー タスク用に DistributedTasks を作成するように注意すれば、許容できる解決策になる可能性があります。
これを実現する org.springframework.scheduling.quartz.SchedulerFactoryBean 拡張機能は次のとおりです。
@Override
public void start() throws SchedulingException {
new Thread(new Runnable() {
@Override
public void run() {
final Lock lock = getLock();
lock.lock();
log.warn("This node is the master Quartz");
SchedulerFactoryBean.super.start();
}
}).start();
log.info("Starting..");
}
@Override
public void destroy() throws SchedulerException {
super.destroy();
getLock().unlock();
}
私が何か大きなものを見逃しているかどうか、そしてこれができるかどうか教えてください.
2 つのファイルを github に追加しました。RAMJobStore 拡張機能は次のとおりです。
Spring SchedulerFactoryBean 拡張機能は次のとおりです。