在项目中越来越多的使用到定时任务,单个项目定时任务太多时就不好管理,这时我们可能需要将任务保存在数据库中,动态的去加载或删除某些定时任务。
1.首先是引入依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dwl</groupId>
<artifactId>minaproject</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
</dependencies>
</project>
2.任务调度管理类。
package com.mina.quatrz;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
/**
* @program: minaproject
* @description: 任务调度管理
* @author: daiwenlong
* @create: 2018-08-17 11:33
**/
public class QuatrzManager {
//任务组名
private static final String JOB_GROUP_NAME = "my_group";
//触发器组名
private static final String TRIGGER_GROUP_NAME = "my_trigger";
//调度工厂
private static SchedulerFactory schedulerFactory = new StdSchedulerFactory();
/**
* @Description: 添加定时任务
* @Param: [jobName:任务名, jobClazz:任务, cron:cron表达式]
* @return: void
* @Date: 2018/8/17
*/
public static void addJob(String jobName ,Class jobClazz ,String cron){
try {
//获取Scheduler
Scheduler scheduler = schedulerFactory.getScheduler();
// 任务名,任务组,任务执行类
JobDetail jobDetail= JobBuilder.newJob(jobClazz).withIdentity(jobName, JOB_GROUP_NAME).build();
// 传参 可以不要
jobDetail.getJobDataMap().put("repId", jobName);
// 触发器
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
// 触发器名,触发器组
triggerBuilder.withIdentity(jobName, TRIGGER_GROUP_NAME);
triggerBuilder.startNow();
// 触发器时间设定
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
// 创建Trigger对象
CronTrigger trigger = (CronTrigger) triggerBuilder.build();
// 调度容器设置JobDetail和Trigger
scheduler.scheduleJob(jobDetail, trigger);
// 启动
if (!scheduler.isShutdown()) {
scheduler.start();
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* @Description: 删除定时任务
* @Param: [jobName:任务名称]
* @return: void
* @Date: 2018/8/17
*/
public static void removeJob(String jobName) {
try {
Scheduler scheduler = schedulerFactory.getScheduler();
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME);
scheduler.pauseTrigger(triggerKey);// 停止触发器
scheduler.unscheduleJob(triggerKey);// 移除触发器
scheduler.deleteJob(JobKey.jobKey(jobName, JOB_GROUP_NAME));// 删除任务
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* @Description: 启动所有任务
* @Param: []
* @return: void
* @Date: 2018/8/17
*/
public static void startJobs() {
try {
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* @Description:删除所有任务
* @Param: []
* @return: void
* @Date: 2018/8/17
*/
public static void shutdownJobs() {
try {
Scheduler scheduler = schedulerFactory.getScheduler();
if (!scheduler.isShutdown()) {
scheduler.shutdown();
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
3.实现Job接口的任务类。
package com.mina.quatrz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* @program: minaproject
* @description: 测试Job
* @author: daiwenlong
* @create: 2018-08-17 12:43
**/
public class TestJob implements Job {
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("执行成功----输出:"+System.currentTimeMillis());
}
}
4.测试。
package com.mina.quatrz;
/**
* @program: minaproject
* @description: 测试
* @author: daiwenlong
* @create: 2018-08-17 12:42
**/
public class Test {
public static void main(String[] args) {
//每五秒执行一次
QuatrzManager.addJob("test",TestJob.class,"*/5 * * * * ?");
}
}
5.使用QuatrzManager我们就可以动态的添加和删除定时任务啦。