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 * * * ?
每天的12点15分、30分触发: 0 15,30 12 * * ?
其他的示例:
在每个周一,二, 三和周四的 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
浙公网安备 33010602011771号