Quartz 简单使用

科技资讯 投稿 5200 0 评论

Quartz 简单使用

Quzrtz 定时任务默认都是并发执行,不会等待上一次任务执行完毕,只要间隔时间到就会执行,如果定时任务执行太长,会长时间占用资源,导致其它任务堵塞

简单示例

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(;
    }
}

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";
    }
}

通过 属性赋值

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 job类上,禁止并发地执行同一个job定义 (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(对 trigger 中的 datamap 无效),如果一个任务不是

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 简单使用

赞同 (25) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽