ホームページ  >  記事  >  Java  >  Quartz を使用して Java でスケジュールされたタスクを実装するにはどうすればよいですか?

Quartz を使用して Java でスケジュールされたタスクを実装するにはどうすればよいですか?

王林
王林転載
2023-05-08 10:46:171480ブラウズ

スケジューラは、同時アクセスの問題を回避するために、実行されるたびに JobDetail に基づいて新しいジョブ インスタンスを作成します (jobDetail のインスタンスも新しい)

Quzrtz スケジュールされたタスクは、によって同時に実行されます。デフォルト、いいえ 最後のタスクが実行されるまで待機し、間隔が経過する限り実行されます。スケジュールされたタスクが長時間実行されると、長時間リソースを占有し、他のタスクが実行されなくなります。

@DisallowConcurrentExecution: ジョブ クラスでは、同じジョブ定義 (JobDetail で定義) の複数のインスタンスの同時実行が禁止されています。

Quartz を使用して Java でスケジュールされたタスクを実装するにはどうすればよいですか?

  • スケジューラ: スケジュールされたタスクの作業コンテナまたはワークプレイスとして理解できます。すべてのスケジュールされたタスクがその中に配置され、開いたり停止したりできます。 。

  • トリガー: スケジュールされたタスクの作業ルール構成として理解できます。たとえば、数分ごとに呼び出されたり、毎にその時点で実行されるように指定されます。日。

  • jobDetail: スケジュールされたタスクの情報 (スケジュールされたタスク、グループなどの名前の構成など)。

  • job: スケジュールされたタスクの実際のビジネス処理ロジックが配置される場所。

#簡単な例

TestClient.Java

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")  //设置JOB的名字和组
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}

TaskJob.Java

import cn.hutool.core.date.DateUtil;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TaskJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("TaskJob => " + DateUtil.now());
    }
}

Quartz を使用して Java でスケジュールされたタスクを実装するにはどうすればよいですか?##usingJobData

usingJobData を通じてスケジュールされたタスクにパラメーターを渡す

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")
                .usingJobData("job","jobDetail1.JobDataMap.Value")
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .usingJobData("trigger","trigger.JobDataMap.Value")
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}

TaskJob.java

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class TaskJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        JobDataMap triggerMap = context.getTrigger().getJobDataMap();
        JobDataMap mergeMap = context.getMergedJobDataMap();


        System.out.println("jobDataMap => " + jobDataMap.getString("job"));
        System.out.println("triggerMap => " + triggerMap.getString("trigger"));
        System.out.println("mergeMap => " + mergeMap.getString("trigger"));
    }
}

Quartz を使用して Java でスケジュールされたタスクを実装するにはどうすればよいですか?

属性を通じて値を割り当てる

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")
                .usingJobData("job","jobDetail1.JobDataMap.Value")
                .usingJobData("name","jobDetail1.name.Value") //通过 setName 自动赋值
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .usingJobData("trigger","trigger.JobDataMap.Value")
                .usingJobData("name","trigger.name.Value")  //如果 Trigger 有值,会覆盖 JobDetail
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}
import org.quartz.*;

public class TaskJob implements Job {

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {

        System.out.println("name => " + name);
    }
}
非同時実行

@DisallowConcurrentExecution ジョブ クラスは、同じジョブ定義 (JobDetail 定義) の複数のインスタンスの同時実行を禁止します。

import cn.hutool.core.date.DateUtil;
import org.quartz.*;

@DisallowConcurrentExecution
public class TaskJob implements Job {

    @Override
    public void execute(JobExecutionContext context) {
        System.out.println("Time => " + DateUtil.now());
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

@PersistJobDataAfterExecution

JobDetail の永続的な JobDataMap (トリガーのデータマップには無効) (タスクが

import cn.hutool.core.date.DateUtil;

import org.quartz.*;

//持久化JobDetail中的JobDataMap(对 trigger 中的 datamap 无效),如果一个任务不是
@PersistJobDataAfterExecution
public class TaskJob implements Job {

    @Override
    public void execute(JobExecutionContext context) {
        JobDataMap triggerMap = context.getJobDetail().getJobDataMap();
        triggerMap.put("count", triggerMap.getInt("count") + 1);
        System.out.println("Time => " + DateUtil.now() + " count =>" + triggerMap.getInt("count"));

    }
}

Client

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class TaskClient {

    public static void main(String[] args) {
        JobDetail jobDetail = JobBuilder.newJob(TaskJob.class)
                .withIdentity("job1", "group1")
                .usingJobData("job","jobDetail1.JobDataMap.Value")
                .usingJobData("name","jobDetail1.name.Value") //通过 setName 自动赋值
                .usingJobData("count",0) //通过 setName 自动赋值
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "trigger1")
                .usingJobData("trigger","trigger.JobDataMap.Value")
                .usingJobData("name","trigger.name.Value")  //如果 Trigger 有值,会覆盖 JobDetail
                .startNow()
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
                        .repeatForever())
                .build();
        try {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.scheduleJob(jobDetail,trigger);
            scheduler.start();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }

    }

}
でない場合)

以上がQuartz を使用して Java でスケジュールされたタスクを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。