一 点睛
1 Scheduler是通过工厂模式创建的。
所有的Scheduler实例由SchedulerFactory来创建。
2 Quartz的三个核心概念
- 调度器
- 任务
- 触发器
3 Scheduler的创建方式
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
DirectSchedulerFactory factory = DirectSchedulerFactory.getInstance();
Scheduler scheduler1=factory.getScheduler();
4 SchedulerFactory
使用一组参数来创建和初始化Quartz调度器
配置参数一般存储在quartz.properties中
调用getScheduler方法就能创建和初始化调度器对象
5 Scheduler的主要函数
- Date scheduleJob(JobDetail jobDetail, Trigger trigger):返回最近一次要执行任务的时间
- void start():启动
- void standby():暂停
- void shutdown():完全关闭,不能再重启
二 实战——scheduleJob返回值
1 启动类
package com.quartz;
import org.quartz.*;
import org.quartz.impl.DirectSchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloScheduler {
public static void main( String[] args ) throws SchedulerException {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current Time is:" + simpleDateFormat.format(date));
//创建一个JobDetail实例, 将该实例与hellojob class 绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob").build(); //演示传递参数
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("0/5 * 16,18 * * ?"))
.build();
//创建Schedule实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
//scheduleJob返回的是最近一次要执行的时间
System.out.println("scheduled time is:"
+ simpleDateFormat.format(scheduler.scheduleJob(jobDetail, trigger)));
}
}
2 测试结果
Current Time is:2018-11-17 14:15:01
scheduled time is:2018-11-17 16:00:00
三 实战——演示standby
1 启动类
package com.quartz;
import org.quartz.*;
import org.quartz.impl.DirectSchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloScheduler {
public static void main( String[] args ) throws SchedulerException, InterruptedException {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current Time is:" + simpleDateFormat.format(date));
//创建一个JobDetail实例, 将该实例与hellojob class 绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob").build(); //演示传递参数
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("* * * * * ?"))
.build();
//创建Schedule实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
//scheduleJob返回的是最近一次要执行的时间
System.out.println("scheduled time is:"
+ simpleDateFormat.format(scheduler.scheduleJob(jobDetail, trigger)));
//sheduler执行两秒后挂起
Thread.sleep(2000);
scheduler.standby();
}
}
2 测试结果
Current Time is:2018-11-17 14:21:40
scheduled time is:2018-11-17 14:21:40
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:21:40
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:21:41
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:21:42
Hello world
四 实战——演示start与standby组合
1 启动类
package com.quartz;
import org.quartz.*;
import org.quartz.impl.DirectSchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloScheduler {
public static void main( String[] args ) throws SchedulerException, InterruptedException {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current Time is:" + simpleDateFormat.format(date));
//创建一个JobDetail实例, 将该实例与hellojob class 绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob").build(); //演示传递参数
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("* * * * * ?"))
.build();
//创建Schedule实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
//scheduleJob返回的是最近一次要执行的时间
System.out.println("scheduled time is:"
+ simpleDateFormat.format(scheduler.scheduleJob(jobDetail, trigger)));
//sheduler执行两秒后挂起
Thread.sleep(2000);
scheduler.standby();
//sheduler挂起3秒后继续执行
Thread.sleep(3000);
scheduler.start();
}
}
2 测试结果
Current Time is:2018-11-17 14:24:34
scheduled time is:2018-11-17 14:24:34
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:24:34
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:24:35
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:24:36
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:24:39
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:24:39
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:24:39
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:24:40
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:24:41
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:24:42
Hello world
五 实战——演示shutdown
1 启动类
package com.quartz;
import org.quartz.*;
import org.quartz.impl.DirectSchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloScheduler {
public static void main( String[] args ) throws SchedulerException, InterruptedException {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current Time is:" + simpleDateFormat.format(date));
//创建一个JobDetail实例, 将该实例与hellojob class 绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob").build(); //演示传递参数
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("* * * * * ?"))
.build();
//创建Schedule实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
//scheduleJob返回的是最近一次要执行的时间
System.out.println("scheduled time is:"
+ simpleDateFormat.format(scheduler.scheduleJob(jobDetail, trigger)));
//sheduler执行两秒后停止
Thread.sleep(2000);
scheduler.shutdown();
//sheduler挂起3秒后继续执行
Thread.sleep(3000);
scheduler.start();
}
}
2 测试结果
Current Time is:2018-11-17 14:27:32
scheduled time is:2018-11-17 14:27:32
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:27:32
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:27:33
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:27:34
Hello world
Exception in thread "main" org.quartz.SchedulerException: The Scheduler cannot be restarted after shutdown() has been called.
at org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:557)
at org.quartz.impl.StdScheduler.start(StdScheduler.java:142)
at com.quartz.HelloScheduler.main(HelloScheduler.java:40)
五 实战——演示shutdown(true)
1 启动类
package com.quartz;
import org.quartz.*;
import org.quartz.impl.DirectSchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloScheduler {
public static void main( String[] args ) throws SchedulerException, InterruptedException {
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current Time is:" + simpleDateFormat.format(date));
//创建一个JobDetail实例, 将该实例与hellojob class 绑定
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
.withIdentity("myJob").build(); //演示传递参数
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
.withIdentity("myTrigger", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("* * * * * ?"))
.build();
//创建Schedule实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
//scheduleJob返回的是最近一次要执行的时间
System.out.println("scheduled time is:"
+ simpleDateFormat.format(scheduler.scheduleJob(jobDetail, trigger)));
//sheduler执行两秒后停止
Thread.sleep(2000);
//shutdown(ture)表示等待所有正在执行的job执行完毕之后,再关闭scheduler
//shutdown(false)即shutdown()表示直接关闭scheduler,默认为false
scheduler.shutdown(true); //演示true
System.out.println("scheduler is shutdown?"+scheduler.isShutdown());
}
}
2 job类
package com.quartz;
import org.quartz.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HelloJob implements Job{
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//打印当前执行的时间
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("+++++++++++++++++++++++++++");
System.out.println("Current Exec Time is:" + simpleDateFormat.format(date));
System.out.println("Hello world");
}
}
3 测试结果
Current Time is:2018-11-17 14:40:09
scheduled time is:2018-11-17 14:40:09
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:40:14
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:40:15
Hello world
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-17 14:40:16
Hello world
scheduler is shutdown?true