以maven工程为讲解例子:
pom.xml
<!--quartz-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
<exclusions>
<exclusion>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
QuartzScheduleUtil.java(调度工具类)
package com.wlt.quartz.util;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
/**
* Created by wlt on 2018/2/20.
*/
public class QuartzScheduleUtil {
private Scheduler scheduler;
public Scheduler getScheduler() {
return scheduler;
}
public void setScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
}
public QuartzScheduleUtil(){
}
public QuartzScheduleUtil(Scheduler scheduler){
this.scheduler = scheduler;
}
/**
* 启动一个调度对象
* @throws SchedulerException
*/
public void start() throws SchedulerException {
if (!scheduler.isShutdown()) {
scheduler.start();
}
}
/**
* 判断调度器是否关闭
* @return
*/
private boolean isShutdown(){
try {
return scheduler.isShutdown();
} catch (SchedulerException e) {
e.printStackTrace();
}
return false;
}
/**
* 调度是否启动
* @return
* @throws SchedulerException
*/
public boolean isStarted() throws SchedulerException {
return scheduler.isStarted();
}
/**
* 关闭调度器
* @throws SchedulerException
*/
public void shutdown() throws SchedulerException {
scheduler.shutdown();
}
/**
* 暂停调度任务
* @return
* @throws SchedulerException
*/
public void unscheduleJob(QuartzScheduleJob job)
throws SchedulerException{
if (!isShutdown()) {
scheduler.pauseJob(new JobKey(job.getJobName(),
job.getJobGroup()));
scheduler.pauseTrigger(new TriggerKey(job.getJobName(),
job.getTriggerGroup()));
}
}
/**
* 重启任务调度
* @param job
*/
public void resumeJob(QuartzScheduleJob job){
try {
if (!isShutdown()) {
scheduler.resumeJob(new JobKey(job.getJobName(),
job.getJobGroup()));
scheduler.resumeTrigger(new TriggerKey(job.getJobName(),
job.getTriggerGroup()));
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 暂停触发器
* @param job
*/
public void pauseTrigger(QuartzScheduleJob job) {
try {
if (!isShutdown()) {
scheduler.pauseTrigger(new TriggerKey(job.getJobName(),
job.getTriggerGroup()));// 停止触发器
}
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
/**
* 恢复触发器
* @param job
*/
public void resumeTrigger(QuartzScheduleJob job) {
try {
if (!isShutdown()) {
scheduler.resumeTrigger(new TriggerKey(job.getJobName(),
job.getTriggerGroup()));// 重启触发器
}
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
/**
* 删除触发器
* @param job
* @return
*/
public boolean removeTrigdger(QuartzScheduleJob job) {
TriggerKey triggerKey = new TriggerKey(job.getJobName(),
job.getTriggerGroup());
try {
if (!isShutdown()) {
scheduler.pauseTrigger(triggerKey);// 停止触发器
}
return scheduler.unscheduleJob(triggerKey);// 移除触发器
} catch (SchedulerException e) {
throw new RuntimeException(e);
}
}
/**
* 暂停调度中所有的job
* 恢复任务时,停止时间段之间的任务会被执行
*/
public void pauseAll() {
try {
if (!isShutdown()) {
scheduler.pauseAll();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 恢复调度中所有的job
* @throws SchedulerException
*/
public void resumeAll() throws SchedulerException {
if (!isShutdown()) {
scheduler.resumeAll();
}
}
/**
* 删除一个任务
* @param job
* @throws SchedulerException
*/
public void removeJob(QuartzScheduleJob job)
throws SchedulerException{
TriggerKey triggerKey = new TriggerKey(job.getJobName(),
job.getTriggerGroup());
if (!isShutdown()) {
scheduler.pauseTrigger(triggerKey);//停止触发器
scheduler.unscheduleJob(triggerKey);//移除触发器
scheduler.deleteJob(new JobKey(job.getJobName(),
job.getJobGroup()));//删除任务
}
}
/**
* 创建一个调度对象
*
* @return
* @throws SchedulerException
*/
public static Scheduler newScheduler() {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = null;
try {
scheduler = sf.getScheduler();
} catch (SchedulerException e) {
e.printStackTrace();
}
return scheduler;
}
}
测试类TIMER.JAVA
package com.wlt.quartz;
import com.wlt.quartz.job.HelloJob;
import com.wlt.quartz.util.QuartzScheduleJob;
import com.wlt.quartz.util.QuartzScheduleUtil;
import org.junit.Test;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.IOException;
import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;
/**
* Created by wlt on 2018/2/20.
*/
public class Timer {
@Test
public void initJob() throws SchedulerException, IOException, InterruptedException {
// Grab the Scheduler instance from the Factory
QuartzScheduleUtil quartzScheduleUtil = new QuartzScheduleUtil(QuartzScheduleUtil.newScheduler());
quartzScheduleUtil.start();
String jobName = "wltTimer";
String jobGroup = "job-group";
String triggerGroup = "trigger-group";
String triggerRule = "*/5 * * * * ?";
QuartzScheduleJob quartzScheduleJob = new QuartzScheduleJob();
quartzScheduleJob.setJobGroup(jobGroup);
quartzScheduleJob.setJobName(jobName);
quartzScheduleJob.setTriggerGroup(triggerGroup);
JobDetail job = newJob(HelloJob.class)
.withIdentity(jobName, jobGroup)
.build();
Trigger trigger = newTrigger()
.withIdentity(jobName, triggerGroup)
.withSchedule(cronSchedule(triggerRule))
.build();
try {
quartzScheduleUtil.getScheduler().scheduleJob(job, trigger);
System.out.println("初始化定时任务success");
System.out.println(quartzScheduleUtil.isStarted());
quartzScheduleUtil.pauseTrigger(quartzScheduleJob);
Thread.sleep(6000);
quartzScheduleUtil.resumeTrigger(quartzScheduleJob);
} catch (SchedulerException e) {
System.out.println("初始化定时任务失败");
}
System.in.read(); // 按任意键退出
}
}
测试任务类HelloJob.java
package com.wlt.quartz.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import java.util.Date;
/**
* Created by wlt on 2018/2/20.
*/
//下面注解代表job是有状态的,即多次运行的job,可以共享变量,默认是每次都会启动一个全新的job,即无状态job
//@PersistJobDataAfterExecution
public class HelloJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println(new Date().getSeconds());
}
}
控制台结果