25

私のアプリケーションでは、ジョブを作成し、CronTriggers でスケジュールします。各ジョブには 1 つのトリガーしかなく、ジョブ名とトリガー名は同じです。トリガーを共有するジョブはありません。

この「0/1 * * * * ?」のような cron トリガーを作成すると、ジョブを毎秒実行するように指示すると、問題なく動作します。

次のように呼び出して最初にジョブを一時停止すると、問題が発生します。

scheduler.pauseJob(jobName, jobGroup);

そして、50秒後に次のようにジョブを再開します。

scheduler.resumeJob(jobName, jobGroup);

私が見ているのは、この 50 秒間、ジョブが要求どおりに実行されなかったことです。しかし、ジョブを再開した瞬間、同時に50回のジョブ実行が見られます!!!

これは不発指示のデフォルト設定によるものだと思いましたが、作成時にトリガーの不発指示をこれに設定した後でも:

trigger.setMisfireInstruction(CronTrigger.MISFIRE_INSTRUCTION_DO_NOTHING);

同じことが起こります。誰でもこれを修正する方法を提案できますか?

4

4 に答える 4

34

CronTriggerを思い出して作品nextFireTime。トリガーを作成した後、nextFireTimeが初期化されます。ジョブがトリガーされるたびにnextFireTime更新されます。一時停止するとジョブはトリガーされないため、nextFireTime「古い」ままです。したがって、ジョブを再開すると、トリガーは古いトリガー時間ごとに戻ります。

問題は、トリガーが一時停止されていることを認識していないことです。これを克服するために、この失火処理があります。ジョブを再開した後、トリガーのupdateAfterMisfire()メソッドが呼び出され、が修正されますnextFireTime。ただし、との差がmisfireThresholdnextFireTimeよりも小さい場合はそうではありません。その後、メソッドは呼び出されません。このしきい値のデフォルト値は60,000です。したがって、一時停止期間が60秒より長くなる場合は、すべて問題ありません。

あなたは問題を抱えているので、そうではないと思います。;)これを回避するには、しきい値を変更するか、単純なラッパーを使用しますCronTrigger

public class PauseAwareCronTrigger extends CronTrigger {
    // constructors you need go here

    @Override
    public Date getNextFireTime() {
        Date nextFireTime = super.getNextFireTime();
        if (nextFireTime.getTime() < System.currentTimeMillis()) {
            // next fire time after now
            nextFireTime = super.getFireTimeAfter(null);
            super.setNextFireTime(nextFireTime);
        }
        return nextFireTime;
    }
}
于 2009-12-27T19:02:36.467 に答える
6

ジョブを一時停止すると、トリガーは引き続き起動しますが、実行はジョブが再開されるまでキューに入れられます。これは不発のトリガーではないため、その設定は効果がありません。

あなたがしたいことは、ジョブを一時停止するのではなく、プログラムでcronトリガーを無効にするか削除することだと思います。再開する場合は、トリガーを再度追加します。

于 2009-12-19T18:05:43.993 に答える
1

少なくとも 1.6.5 (私の手元にあるクォーツの最も古いバージョン) 以降、スケジューラーには名前/グループをパラメーターとして受け取る pauseTrigger メソッドがあります。これは、使用するすべてのトリガー タイプのサブクラスを持つ必要がないことを意味します。また、ファンキーな削除/挿入トリックを行う必要もありません。

1) 私たちのデータベースには厳密な削除禁止ポリシーがあり、2) 私が使用するカスタム データストアはトリガー サブクラスをサポートしていないため、これらは両方とも私にとって重要です。

于 2010-02-14T05:36:09.677 に答える