2

私は、データベースからスケジュールジョブを読み取り、正常に動作するようにスケジュールするスケジューラエンジンに取り組んできましたが、データベース内の行は、特定のタイプのジョブの「構成」にすぎません。

FTPを取得するための特定の構成には

host: imagineryHost1.com 
post: 22

そして、同じクラスの別の

host: imagineryHost2.com
post: 21

独自のトリガーと独自の個別のデータを持つ 2 つの FPTjob を作成します。

/**
BaseJob is an Abstract class extending QuartzJobBean used to handle our logging and 
other requirements that need across all our jobs.
*/
public class FTPJob extends BaseJob {

    /**
        Called from executeInternal of QuartzJobBean 
    */
    @Override
    public boolean execute1V(JobExecutionContext context) {
        //Code to get Files from FTP.
    }
}

これらは、TriggerBuilder と cron を使用してスケジュールされます。

@DisallowConcurrentExecution を追加すると、一度に実行できる FTPJob のインスタンスは 1 つだけになりますが、FTPJob の複数のインスタンスを実行できるようにする必要がありますが、そのクラスの特定の構成の 1 つのインスタンスのみに制限する必要があります。

進行方法に関するリードは高く評価されます:)

アップデート

ftom2の回答に基づいて、すべてのジョブ構成に独自のuniqueIDがあるため、掘り下げてTriggerListenerを見つけました.ieの実行からジョブを「拒否」できます。

public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
    try {
        Iterator<JobExecutionContext> it =     
        context.getScheduler().getCurrentlyExecutingJobs().iterator();

        boolean found = false;
        while(it.hasNext()) {
            JobExecutionContext job = it.next();

            if(trigger.getJobKey().equals(job.getJobDetail().getKey())) {
                return false;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

これを処理するためにもう少し組み込まれている他の方法はありますか?

4

3 に答える 3

1

それが可能かどうかはわかりませんが、これは方向性かもしれません。

JobListenerを実装してから、次のことを行うことができます。

  1. jobWasExecuted を使用して、このジョブが終了したというフラグを jobDetails に設定します。
  2. jobToBeExecuted を使用して、開始前にジョブのステータスを確認し、実行中の状態かどうかを確認します。実行中の場合は停止し (こちらを参照)、そうでない場合は実行させ、状態を実行中に設定します。

お役に立てれば。

于 2012-06-27T10:03:06.433 に答える
0

ステートフル ジョブの同時実行は許可されていないようです。Job インターフェイスの代わりに StatefulJob を実装するだけでかまいません。

于 2014-05-21T19:10:30.410 に答える