2

Java バックエンド用のモニターを作成しており、さまざまなもの (メモリ、CPU、ユーザー アクティビティ、負荷など) をさまざまなタイミングで監視できるようにする必要があります。最も重要なことは、次の特性を持つように各モニター ( MemoryMonitorJobCpuMonitorJob、など)を構成できる必要があることです。ActivityMonitorJob

  • 定期的なサイクルでオン/オフします (15 分に 1 回など)。
  • 電源がオンになった後、どれくらいの時間オンのままになるかを構成するには (たとえば、2 分)
  • したがって、たとえば、MemoryMonitorJobを 15 分ごとに開始し、2 分間オンにしてからオフにするように構成したいと思いますが、その 2 分間の間隔が次の実行までの時間をオフセットすることはありません!

したがって、この特定の例では、モニターは次の動作を示します。

  1. t = 0、オンにする
  2. 0 < t < 2、実行
  3. t = 2、オフにする
  4. t = 15、オンにする
  5. 15 < t < 17、実行
  6. t = 17、オフにする
  7. t = 30、オンにする
  8. ...

明らかに、構成コードのどこかで、「間隔」が「期間/サイクル」時間に達していないか、超えていないことを確認する必要があります。

ここでの作業にはQuartz Schedulerが適切なツールだと思いますが、過去に単純な cron ジョブ (「 X を 15 分ごとに実行」)をセットアップするためにしか使用したことがありません。この間隔プロパティは私を悩ませています.QuartzCronTriggerImplドキュメントを注意深く見た後、Quartzジョブをこのように動作するように設定する方法を理解できないようです.

理想的には、Quartz がこの種の動作を処理できる場合Job、適切な期間/間隔設定で 1 つのモニター実装を構成し、それらをスケジューラーに追加するだけです。

クォーツはこれを処理できますか? もしそうなら、どのように(例を見ることができますか?!?)? そうでない場合、ここでのオプションは何ですか? 前もって感謝します!

4

2 に答える 2

2

実際、Quartz トリガーはまさにあなたが望むように動作します。

Trigger trigger = newTrigger()
    .withSchedule(simpleSchedule()
        .withIntervalInMinutes(15)
        .repeatForever())
    .forJob(memoryMonitorJob)
    .build();

これはMemoryMonitorJob、ジョブの実行時間に関係なく、正確に 15 分ごとに起動します。もちろん、ジョブクラスを 2 分間実行し続けるかどうかはあなた次第です (スリープ、ループなど)。

ジョブが 15 分以上実行される場合、次の 2 つのオプションがあります。

  • デフォルトでは、Quartz は同じジョブを再度起動し、前の実行をオーバーラップします。
  • ジョブがステートフルな場合、Quartz はジョブを再度トリガーせず、前のジョブが完了するのを待ちます。
于 2012-09-23T08:22:16.223 に答える
0

ここにはいくつかのオプションがあると思いますが、最も簡単なのは、CronTrigger を使用して 15 分ごとにジョブを実行し、ジョブ内の 2 分を追跡することです。

ジョブコード

public void execute(JobExecutionContext context) throws JobExecutionException {
    Date now = new Date();
    Date inTwoMinutes = new Date(now.getTime() + 2*60*1000);
    while(inTwoMinutes.before(now)) {
        // do something
        now = new Date();
    }
}

スケジューリング コード

job = newJob(MyJob.class)
    .withIdentity("job", "group")
    .build();

trigger = newTrigger()
    .withIdentity("trigger", "group")
    .withSchedule(cronSchedule("0 15 * * * ?"))
    .build();

sched.scheduleJob(job, trigger);

これにより、15 分ごとにジョブがトリガーされます。

もう 1 つのオプションは、15 分と 16 分に毎秒同じジョブをトリガーすることです。その場合、while ループは必要ありません。ただし、欠点は、ジョブ間で状態を維持するのが難しいことです。トリガーは次のようになります。

trigger = newTrigger()
    .withIdentity("trigger", "group")
    .withSchedule(cronSchedule("* 15,16 * * * ?"))
    .build();

トリガーの詳細については、 http ://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger を参照してください。

于 2012-09-22T19:21:57.697 に答える