8

テラコッタの人たちにとって不公平であることは知っていますが、クラスター化された環境でスケジュールされたジョブを使用するためにHazelcastを使用しようとした人はいますか?

私がイメージできる最も単純な実装は、次のアーキテクチャです。

  1. 1 つのサーバーのみが Quartz 構成を起動するようにするためのグローバル Hazelcast ロック。
  2. 実際のタスクを DistributedTask として実行します。(これは後で行うことができます。現時点では、重いスケジュールされたタスクが DistributedTask のトリガーを処理する必要があります)
  3. ロックを保持しているサーバーがダウンするとすぐに、別のサーバーがロックを取得します。

テラコッタのものを常に開いて開発環境全体の面倒を必要としないため、これはすでにヘーゼルキャストを持っている人にとって大きな利点になると思います.

今のところ、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 拡張機能は次のとおりです。

https://github.com/mufumbo/quartz-hazelcast/blob/master/src/main/java/com/mufumbo/server/scheduler/hazelcast/HazelcastRAMJobStore.java

Spring SchedulerFactoryBean 拡張機能は次のとおりです。

https://github.com/mufumbo/quartz-hazelcast/blob/master/src/main/java/com/mufumbo/server/scheduler/hazelcast/SchedulerFactoryBean.java

4

2 に答える 2

9

私は少し前に同じコンセプトについて考えていました。SPIインターフェースを実装することで、実際Hazelcastに簡単に統合できます。インメモリ データ構造に基づくジョブ ストアと、クラスタ化されたデータベース バックアップ ストアを実装する方法については、参考文献としてチェックしてください。quartz-schedulerJobStoreRAMJobStoreJobStoreTX

このインターフェイスは非常に大きいですが、RAM または Terracotta から Hazelcast に切り替えるために必要な唯一の場所です。後者のライブラリはすでに分散ストレージとロックを提供しているため、かなり簡単です。

実装 (GitHub?) を共有できれば素晴らしいと思います。多くの人にとって、Terracotta クラスターの実行可能な代替手段になると思います。

于 2012-06-21T15:50:56.983 に答える