看下图这三个的 关系:
看清关系之后写代码分析:
MyScheduler 类:
package cn.org.test; import cn.org.job.MyJob; import cn.org.job.MyJob02; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.text.SimpleDateFormat; import java.util.Date; /** * Created with IntelliJ IDEA. * User: Jayden * Date: 2018/7/31 * Time: 8:58 */ public class MyScheduler { public static void main (String[] args){ //下面的.usingJobData("message","job1使用的jobDetailmap") 就是给JobDataMap 里面添加key,value; //jobDetail trigger 都是bulider模式创建,通过.withIdentity("job01","group1") 方式设置 name, group,quartz的机制是一个job可以有多个trigger,但是一个trigger只能有一个job。 JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job01","group1").usingJobData("message","job1使用的jobDetailmap").build(); JobDetail jobDetail1 = JobBuilder.newJob(MyJob02.class).withIdentity("job02","group02").usingJobData("message","job02使用的jobDetailmap").build(); //设定时间戳 启动3秒后开始执行,时间间隔是每两秒执行一次 /* long currentTimeMillis = System.currentTimeMillis(); SimpleDateFormat format = new SimpleDateFormat("yyyy- MM -dd HH:mm:ss"); System.out.println("当前时间是:"+ format.format(new Date())); currentTimeMillis += 3000; Date date = new Date(currentTimeMillis); SimpleDateFormat format1 = new SimpleDateFormat("yyyy- MM -dd HH:mm:ss"); System.out.println("开始时间是:"+ format1.format(date));*/ /* try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }*/ /** * trigger 主要是触发器,设置在什么时间触发,以及触发次数,它的属性包含 JobKey,startTime,endTime,这些属性值都可以在job类里面通过JobExecutionContext context获取, * 常用的实现类SimpleTrigger 和CronTrigger,它的创建模式和JobDetail一样都是用builder模式; * */ /*另一种方式设置时间戳 5秒后 * Date date =new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); date.setTime(date.getTime() + 5000); simpleDateFormat.format(date); * * * */ Date date =new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); date.setTime(date.getTime() + 5000); simpleDateFormat.format(date); Date endDate = new Date(); endDate.setTime(endDate.getTime()+10000); //SimpleTrigger的两种用法 //1.这里设置的是五秒后执行一次。 //SimpleTrigger simpleTrigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("simpleTrigger","simpleGroup").startAt(date).build(); //2.下面这一行代码,意思是对于forJob(jobDetail)的job 创建在5秒后执行的任务,结束时间是当前时间的的10秒后,中间时间每2秒执行一次,这样算下来总共执行3次此任务。 // SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger().forJob(jobDetail).withIdentity("simpleTrigger02","simpleGroup02").startAt(date).withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)).endAt(endDate).build(); //CronTrigger 强大之处主要在于它的cron表达式,是一条字符串形式,它是基于Calendar日历来设置触发时间,cron表达式的格式 从左到右(用空格隔开):"秒 分 时 天 月 周 (年)",中间有空格,具体使用问度娘,这里举例几个, //1.2018年每天10点15分触发一次 0 15 10 ?* * 2018 //2.每天的14点整至14点59分55秒,以及18点整至18点59分55秒, 每五分钟触发一次 0/5 0 14,18 * * ? //3.每月周一至周五的10点15分触发一次 0 15 10 ? * MON-FRI //4.每月最后一天的10点15分触发一次 0 15 10 L * ? //5.每月第三个周五的10点15分触发一次 0 15 10 ? * 6#3 //下面创建的CronTrigger 对象,距离当前时间的5秒后开始,结束时间是当前时间的10秒后,这段时间其间,每隔2秒执行一次! CronTrigger cronTrigger = (CronTrigger) TriggerBuilder.newTrigger().startAt(date).endAt(endDate).withIdentity("cronTrigger","cronGroup").withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * ? * *")).build(); System.out.println("现在时间:nowTime"+ simpleDateFormat.format(new Date())); //获取Scheduler调度器, SchedulerFactory sf = new StdSchedulerFactory(); try { Scheduler scheduler =sf.getScheduler(); //开始调度 scheduler.start(); //调度jobDetail和trigger // scheduler.scheduleJob(jobDetail,simpleTrigger); scheduler.scheduleJob(jobDetail,cronTrigger); } catch (SchedulerException e) { e.printStackTrace(); } } }
MyJob类:
package cn.org.job; import org.quartz.*; import java.text.SimpleDateFormat; import java.util.Date; /** * Created with IntelliJ IDEA. * User: Jayden * Date: 2018/7/31 * Time: 8:47 */ public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH : mm: ss"); System.out.println( "job当前时间:"+format.format(date)); /* JobKey jobKey = context.getJobDetail().getKey(); String name = jobKey.getName(); String group = jobKey.getGroup(); System.out.println("此任务的name: " + name + "组名称 :"+ group + "在"+format.format(date) + "开始运行!"); JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); System.out.println("获取JobDetailMap 的message 的值:" + jobDataMap.get("message") );*/ //获取simpleTrigger的属性信息 /*SimpleTrigger trigger = (SimpleTrigger) context.getTrigger(); String jobName = trigger.getJobKey().getName(); String jobGroup = trigger.getJobKey().getGroup(); Date startTime = trigger.getStartTime(); Date endTime = trigger.getEndTime(); String triggerName = trigger.getKey().getName(); String triggerGroup = trigger.getKey().getGroup(); SimpleDateFormat format1 = new SimpleDateFormat("yyyy- MM -dd HH:mm:ss"); System.out.println("任务的startTime:" + format1.format(startTime)); System.out.println("jobDetail的name:" + jobName); System.out.println("jobDetail的group:" + jobGroup); System.out.println("trigger的name:" + triggerName); System.out.println("trigger的group:" + triggerGroup); System.out.println("任务的endTime:" + format1.format(endTime));*/ //获取crontrigger的信息 CronTrigger cronTrigger = (CronTrigger) context.getTrigger(); String cronExpression = cronTrigger.getCronExpression(); Date startTime = cronTrigger.getStartTime(); Date endTime = cronTrigger.getEndTime(); System.out.println("任务的startTime:" + format.format(startTime)); System.out.println("cronTrigger的cron表达式:"+cronExpression); // System.out.println("任务的endTime:" + format.format(endTime)); System.out.println("====================================="); } }