视频参考: https://www.bilibili.com/video/av36062910?from=search&seid=9983946144685716619
声音感觉小的可以设置windows响度均衡:https://jingyan.baidu.com/article/ed15cb1ba197551be2698171.html
cron表达式生成工具,可调试cron: http://www.bejson.com/othertools/cron/
官网:www.quartz-scheduler.org
组件模式:最终要的三部分:日任务job,触发器trigger,调度器schedule
所有的任务调度都要通过execute完成
入门案例:
public class HelloJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 输出当前时间 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dataString = sdf.format(date); // 工作内容 System.out.println("正在进行数据库的备份工作,备份数据库的时间是:" + dataString); } }
public class HelloScheduleDemo { public static void main(String[] args) throws Exception { // 1.调度器(Scheduler) ,从工厂中获取调度的实例(默认:实例化) Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 2.任务实例 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1") // 参数1:任务的名称;参数2:任务组的名称 .build(); // 3.触发器 SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "group1")// 参数1:触发器名称;参数2:触发器组的名称 .startNow()// 马上启动触发器 .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)).build(); // 让调度器关联任务和触发器,保证按照触发器定义的条件执行任务 scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); } }
public class HelloScheduleDemo { public static void main(String[] args) throws Exception { // 1.调度器(Scheduler) ,从工厂中获取调度的实例(默认:实例化) Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // 2.任务实例 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1") // 参数1:任务的名称;参数2:任务组的名称 .build(); System.out.println("名称:" + jobDetail.getKey().getName()); System.out.println("组的名称:" + jobDetail.getKey().getGroup()); System.out.println("任务类" + jobDetail.getJobClass().getName()); // 3.触发器 SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "group1")// 参数1:触发器名称;参数2:触发器组的名称 .startNow()// 马上启动触发器 .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)).build(); // 让调度器关联任务和触发器,保证按照触发器定义的条件执行任务 scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); } }
输出:
名称:job1 组的名称:group1 任务类com.quartz.HelloJob INFO [main] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started. 正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:06:49 正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:06:54 正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:06:59 正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:07:04 正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:07:09 正在进行数据库的备份工作,备份数据库的时间是:2019-09-04 23:07:14
HelloSchedulerDemo.java
HelloJob.java
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); // 从JobDetail中获取JobDataMap的数据 String jobDataMessage = jobDataMap.getString("message"); System.out.println("任务数据的参数值:" + jobDataMessage); // 获取Trigger对象中获取JobDataMap的数据 JobDataMap jobDataMap2 = context.getTrigger().getJobDataMap(); String triggerDataMessage = jobDataMap2.getString("message"); System.out.println("触发器数据的参数值:" + triggerDataMessage); //获取trigger的内容 TriggerKey triggerKey=context.getTrigger().getKey(); System.out.println("触发器名称:"+triggerKey.getName()+";触发器组:"+triggerKey.getGroup()); System.out.println("****************"); //获取其他内容 System.out.println("当前任务执行时间:"+sdf.format(context.getFireTime())); System.out.println("下一次任务执行时间:"+sdf.format(context.getNextFireTime()));
如果想要获取job的数据,key不能设置和trigger一样
public class HelloSchedulerDemoTrigger { public static void main(String[] args) throws Exception { //设置任务的开始时间 Date startDate = new Date(); startDate.setTime(startDate.getTime()+3000); //设置任务的结束时间 Date endDate = new Date(); endDate.setTime(endDate.getTime()+10000); //1.调度器(Scheduler),从工厂中获取调度的实例(默认:实例化new StdSchedulerFactory()) Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler(); //2.任务实例(JobDetail) JobDetail jobDetail = JobBuilder.newJob(HelloJobTrigger.class) .withIdentity("job1", "group1")// .usingJobData("message", "打印日志")//传递参数,名称message .build(); //3.触发器(Trigger) Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger", "group1") // .startNow()//马上启动触发器 .withSchedule(SimpleScheduleBuilder.simpleSchedule().repeatSecondlyForever(5)) .startAt(startDate)//设置任务开始时间 .endAt(endDate)//设置任务结束时间 .build(); //让调度器关联任务和触发器,保证按照触发器定义的条件执行任务 defaultScheduler.scheduleJob(jobDetail, trigger); //启动 defaultScheduler.start(); } }
public class HelloJobTrigger implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { //输出当前日期 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateString = sdf.format(date); //工作內容 System.out.println("正在进行数据库的备份工作" + dateString); //获取jobKey、startTime、endTime Trigger trigger = context.getTrigger(); System.out.println("jobKey的名称:" + trigger.getJobKey().getName()); System.out.println("jobKey组的名称:" + trigger.getJobKey().getGroup()); System.out.println("任务的开始时间:" + sdf.format(trigger.getStartTime())); System.out.println("任务的结束时间:" + sdf.format(trigger.getEndTime())); } }
cron表达式生成工具:http://www.bejson.com/othertools/cron/
本教程重点讲解StdSchedulerFactory,DirectSchedulerFactory自行了解
public class MyJobListener implements JobListener { @Override public String getName() { // 监听器名称 String name = this.getClass().getName(); name = "监听器的名称是:" + name; return name; } @Override public void jobToBeExecuted(JobExecutionContext context) { System.out.println("Scheduler在JobDetail将要执行时调用的方法"); } @Override public void jobExecutionVetoed(JobExecutionContext context) { System.out.println("否决"); } @Override public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) { System.out.println("scheduler在job执行之后的监听"); } }
public class HelloSchedulerDemoJobListener { public static void main(String[] args) throws SchedulerException, Exception { // 任务实例: JobDetail jobDetail = JobBuilder.newJob(HelloJobScheduler.class) .withIdentity("job1", "group1") .build(); // 触发器: Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")// 参数1:设置触发器名称,参数2:设置触发器组的名称 .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")).build(); // 让调度器关联任务和触发器,保证按照触发器定义的添加执行任务 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); Date scheduleJob = scheduler.scheduleJob(jobDetail, trigger); System.out.println("调度器的开始时间是:" + new SimpleDateFormat("yyyy-MM-dd HH:dd:ss").format(scheduleJob)); //创建并注册一个全局的job listener // scheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs()); //创建并注册一个局部的job listener scheduler.getListenerManager().addJobListener(new MyJobListener(),KeyMatcher.keyEquals(JobKey.jobKey("job1", "group1"))); scheduler.start(); } }
public class MyTriggerListener implements TriggerListener { @Override public String getName() { String name = this.getClass().getSimpleName(); System.out.println("触发器的名称:" + name); return name; } @Override public void triggerFired(Trigger trigger, JobExecutionContext context) { String triggerName = trigger.getKey().getName(); System.out.println("触发器的名称:" + triggerName + "被触发了"); } @Override public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) { String triggerName = trigger.getKey().getName(); System.out.println("触发器的名称:" + triggerName + "没有触发"); return false;// true表示不会执行job的方法 } @Override public void triggerMisfired(Trigger trigger) { String triggerName = trigger.getKey().getName(); System.out.println("触发器的名称:" + triggerName + "错过触发"); } @Override public void triggerComplete(Trigger trigger, JobExecutionContext context, CompletedExecutionInstruction triggerInstructionCode) { String triggerName = trigger.getKey().getName(); System.out.println("触发器的名称:" + triggerName + "完成之后触发"); } }
// 创建并注册一个全局的trigger listener // scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), EverythingMatcher.allTriggers()); // 创建并注册一个局部的trigger listener scheduler.getListenerManager().addTriggerListener(new MyTriggerListener(), KeyMatcher.keyEquals(TriggerKey.triggerKey("trigger1", "group1")));