1.新建一个job,运行的内容就主要就在job中
package com.fhqiwcw.quartz.train;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloWorldJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
JobDataMap jobDataMap = context.getMergedJobDataMap();
System.out.println("Hello word!");
System.out.println("\t" + jobDataMap.getString("message"));
System.out.println("\t下次运行时间" + context.getNextFireTime());
}
}
2.测试运行
package com.fhqiwcw.quartz.train;
import java.text.ParseException;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
public class MyMain {
public static void main(String[] args) throws SchedulerException, ParseException {
// 实例化一个Schedule,用于任务的调度
Scheduler schedule = new StdSchedulerFactory().getScheduler();
schedule.start();
// jobDetal job的详细作息,包括job名,要运行job的类
JobDetail jobDetail = new JobDetail("helloworldjob", HelloWorldJob.class);
JobDataMap map = jobDetail.getJobDataMap();
map.put("message", "this is helloworld jobdetail");
jobDetail.setJobDataMap(map);
// 实例化触发器
// 简单的触发器,功能比较单一
//Trigger trigger = new SimpleTrigger("helloworldtriger", 10, 1000);
// CronTrigger 接受cron表达式的触发器,功能很强大
String cronExp = "0/5 * * * * ?";
Trigger trigger = new CronTrigger("helloworldtrigger", Scheduler.DEFAULT_GROUP,cronExp);
schedule.scheduleJob(jobDetail, trigger);
}
}
3.cron表达式简介:
Cron表达式的组件
位置 | 含义 | 允许的特殊字符 |
1 | 秒( 0-59 ) | , 、 - 、 * 和 / |
2 | 分( 0-59 ) | , 、 - 、 * 和 / |
3 | 小时( 0-23 ) | , 、 - 、 * 和 / |
4 | 日期( 1-31 ) | , 、 - 、 * 、 / 、 ? 、 L 、 W 和 C |
5 | 月( JAN-DEC 或 1-12 ) | , 、 - 、 * 和 / |
6 | 星期( SUN-SAT 或 1-7 ) | , 、 - 、 * 、 / 、 ? 、 L 、 C 和 # |
7 | 年(可选, 1970-2099 ), 若为空,表示全部时间范围 | , 、 - 、 * 和 / |
每一个组件接受一个指定范围的值,如秒和分接受0~59而日期则接受1~31。对于星期或月,你可以使用数字例如星期天数的1~7,或者文本SUN-SAT。
每一个部分也接受一组给定的特殊字符,例如当把"*"放在小时部分时表示每个小时,在星期部分使用一个表达式例如6L表示每个月最后一个星期五。表12-2说明了Cron的通配符和特殊字符。
Cron表达式的通配符和特殊字符
特殊字符 | 说明 |
* | 任意值。这个特殊字符可以被使用在表达式的任何域, 表示不应该检查该值。因此,我们的 Cron 表达式可以在 1970 ~ 2099 年的任意一天,任意月份和星期中的任意一天触发 |
? | 无特定值。此特殊字符通常和其他指定的值一起使用, 表示必须显示该值但不能检查 |
- | 范围。例如小时部分 10-12 表示 10:00 、 11:00 和 12:00 |
, | 列分隔符。此特殊字符可以让你指定一系列的值, 例如在星期域中指定 MON 、 TUE 和 WED |
/ | 增量。此特殊字符表示一个值的增量,例如 0/1 表示从 0 开始, 每次增加 1 min |
L | L 是英文单词 Last 的缩写。它在日期和星期域中表示有一点不同, 挡在日期域中使用时,表示这个月的最后一天( 3 月 31 日 、 2 月 29 日等)。当使用在星期域时,它永远是同一个值: 7 —— 星期六。当你希望使用星期中某一天时, L 字符非常有用。例如, 星期域中 6L 表示每个月的最后一个星期五 |
W | W 只可以用在月域部分的天字段,指定临近一周(星期一到星期五) 给该月的既定日期。设置值 7W ,触发器若第 7 此触发在一个星期六, 那么它将在第六天触发。若第七天是星期日,触发器将在星期一触发, 即第八天。注意触发器由于周六是第一天,实际触发发生在第三天 |
# | 此特殊字符可使用在星期域中,表示该月的第几个星期。 例如 1#2 表示每个月的第一个星期一 |
C | 日历值。它可以使用在日期和星期域中。日期值是根据一个 给定的日历计算出来的。在日期域中给定一个 20C 将在 20 日 (日历包括 20 日)或 20 日后日历中包含的第一天(不包括 20 日) 激活触发器。例如在一个星期域中使用 6C 表示日历中星期五 (日历包括星期五)或者第一天(日历不包括星期五) |