Quartz任务调度

一、基本概念

在java中,可以通过Quatz框架来实现定时任务。

Quartz主要包括以下部分:

1.scheduler:调度器,可以把任务和触发器注册到任务调度器中,然后启动调度器。

2.Trigger :触发器,包括SimpleTrigger和CronTrigger。CronTrigger可以实现复杂的触发条件。
3.JobDetail :  定义的是任务数据,而真正的执行逻辑是在Job中
4.Job :任务接口,通过实现该接口,在execute()方法中实现定时的任务,也就是业务逻辑。

二、代码演示

首先,在maven中导入依赖,如下所示:

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>

示例代码如下:

QuartzJob.java如下:

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

import java.util.Date;

public class QuartzJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println(new Date());

    }
}

如下所示:

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

import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;

public class QuartzScheduling {
    public static void main(String[] args) throws SchedulerException, InterruptedException {
        SchedulerFactory schedulerFactory=new StdSchedulerFactory();
        //创建scheduler,也即调度器
        Scheduler scheduler=schedulerFactory.getScheduler();
        //定义一个JobDetail,定义的是任务数据,而真正的执行逻辑是在Job中
        JobDetail jobDetail=newJob(QuartzJob.class)
                .withIdentity("QuartzJob")
                .build();
        //定义一个Trigger,也就是定义触发的条件。
        Trigger  trigger=newTrigger()
                   .withIdentity("simpleTrigger")                        // 定义name,这里还可以定义group
                   .withSchedule(    simpleSchedule()
                                     .withIntervalInSeconds( 2 )         //每隔2 秒执行一次
                                     .repeatForever() )               //一直执行,永不停止
                   .startAt( DateBuilder.futureDate(2, DateBuilder.IntervalUnit.SECOND )  )     //接下来的2秒执行
                  .build();
        // 把任务和触发器注册到任务调度器中
        scheduler.scheduleJob(jobDetail  , trigger);
        //启动任务调度器
        scheduler.start();
        //运行一段时间后关闭
        Thread.sleep(10*1000);
        scheduler.shutdown(true);
    }
}

  以上代码中使用的触发器是simpleTrigger,如果要求的触发条件比较复杂,可以使用cronTrigger,

 以下这个触发器表示的是每天的12点15分、30分触发。

 //定义一个Trigger,也就是定义触发的条件。
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("cronTrigger")
                   .withSchedule(CronScheduleBuilder.cronSchedule("0 15,30 12 * * ?"))     
                    .startNow() 
                    .build();

CronScheduleBuilder.cronSchedule()里面的表达式依次表示      [秒] [分] [小时] [日] [月] [周] [年]

其中,表达式中的特殊符号的意义是:

    “*” 代表这个时间单位的整个时间段.比如 *放在秒上面,就是指任意秒,*放在分上面就是任意分。

               “?”字符:表示不确定的值(注意:? 号只能用在日和周域上,但是不能在这两个域上同时使用。假如你为这两域的其中一个指定了值,那就必须在另一个字值上放一个 ?,如:0 0 0 * * ?)

               “,”字符:指定数个值

               “-”字符:指定一个值的范围

               “/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m

               “L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X

               “W”字符:指定离给定日期最近的工作日(周一到周五)

               “#”字符:表示该月第几个周X。5#2表示该月第2个周四(每周的第一天是从周日开始的,即:周日的值为:1)

简单的使用 Cron 的示例如下:

常见的Cron

每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?

其他的示例:

在每个周一,二, 三和周四的 10:15 AM 0 15 10 ? * MON-FRI
每月10号的 10:15 AM   0 15 10 10 * ?
每月最后一天的 10:15 AM 0 15 10 L * ?
每月最后一个周五的 10:10 AM  0 10 10 ? * 6L
在 2014, 2015, 2016, 和 2017 年中的每月最后一个周五的 10:10 AM  0 10 10 ? * 6L 2014-2017
每月第三个周五的 10:15 AM 0 15 10 ? * 6#3
每月从第一天算起每五天的 12:00 PM (中午) 0 0 12 1/5 * ?
每一个 11 月 11 号的 11:11 AM 0 11 11 11 11 ?
三月份每个周三的 2:10 PM 和 2:44 PM 0 10,44 14 ? 3 WED

* 详情参考博客:

https://www.cnblogs.com/drift-ice/p/3817269.html

https://blog.csdn.net/woniu211111/article/category/7693137

https://www.cnblogs.com/gaoqing/p/3651106.html