14

高可用性を備えたスケーラブルな「アット」代替品を探しています。実行時のジョブの追加と削除をサポートする必要があります。

いくつかの背景: 何百万ものイベントをトリガーするアプリケーションがあり、各イベントは 1 回だけ発生します。cron のようなメカニズム (月の最初の日曜日など) は必要ありません。単純に日付、時刻、およびコンテキストです。

現在、私はQuartz スケジューラーを使用しています。これは非常に優れたプロジェクトですが、多くの微調整 (シャーディング、ポーリング間隔の増加など) の後でも、スローされるイベントの量を処理するのは困難です。下線データベースで実行する基本的なロック。また、基本的に数百万のワンタイムトリガーと比較的少数のジョブがあるため、これは私たちにとって少しやり過ぎです。

提案をいただければ幸いです

4

3 に答える 3

1

同じシナリオに直面していた場合、次のことを行います...

いくつかのボックスでのキュー レプリケーション セットアップを使用して、JMS キュー クラスタ (RabbitMQ または ActiveMQ など) をセットアップします。

すべてのイベントを、高可用性の優れた JMS キューで起動します。

次に、必要に応じて JMS キューのイベントをポップするエージェント アプリケーションをコーディングします。複数のボックスで複数のエージェントを実行し、それを正しい JMS フェイルオーバー URL などと組み合わせることができます。

ジョブがイベントを発生させている場合は、同じ種類のモデルを使用することもできます...

参考までに、コア Java でのスケジューリングのより良い方法は次のとおりです。

ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(sensibleThreadCount);
    threadPool.scheduleAtFixedRate(new Runnable() {

    @Override
    public void run() {
       //Pop events from event queue.
       //Do some stuff with them.
    }

    }, initialDelay, period, TimeUnit.X);
于 2012-06-07T09:28:27.447 に答える
0

たぶん、実行時間でソートされたタスクでJGroups 共有ツリーを使用するだけです。ノードは最初のタスクを取得し、指定された時間に実行されるタイマーをスケジュールします。オンタスク削除タイマーをキャンセルできます。したがって、基本的には JGroups と単純な Java タイマー/エグゼキューターのみを使用できます。

私はそれを全部読んだわけではありませんが、ここにいくつかの概念実証またはおそらく解決策があります

于 2012-05-31T10:16:34.363 に答える
-1

Javaタイマーはどうですか?

import java.util.*;

public class MyTask extends TimerTask{
   public void run(){
       System.out.println( "do it!" );
   }
}

その後

Timer timer = new Timer();

MyTask job1 = new MyTask();
// once after 2 seconds
timer.schedule( job1, 2000 );

job1.cancel();

MyTask job2 = new MyTask(); 
// nach each 5 seconds after 1 second
timer.schedule  ( job2, 1000, 5000 );
于 2012-06-05T13:55:42.043 に答える