一、基本概念
在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