如何使用Schedule动态实现定时任务并监听实现业务?
第一步,在项目pom文件中引入schedule依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
第二步,手写工具类
@Component
public class ScheduleHandle {
/**
*
* @param key 任务凭证
* @param remindTime 触发时间
* @throws Exception
*/
public Boolean createTask(String key,Date remindTime,Integer remindStyle) throws Exception {
try {
SchedulerFactory schedulerFactory =new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 启动调度器
scheduler.start();
Class jobClassName=new ScheduleTaskListener().getClass();
// 构建job信息
JobDetail jobDetail = JobBuilder.newJob(jobClassName)
.withIdentity("TaskScheduler"+key).usingJobData("parameter", key)
.usingJobData("remindStyle",remindStyle).build();
//生产表达式
String cron=formatDateByPattern(remindTime,0);
// 表达式调度构建器(即任务执行的时间)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("TaskScheduler"+key).withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
return true;
} catch (SchedulerException e) {
throw new SchedulerException("创建定时任务失败"+e);
} catch (Exception e) {
throw new Exception("后台找不到该类名");
}
}
/**
* 修改定时任务
* @param key
* @param remindTime
* @return
*/
public Boolean updateTask(String key,Date remindTime,Integer remindStyle){
try {
SchedulerFactory schedulerFactory =new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 停止触发器
scheduler.pauseTrigger(TriggerKey.triggerKey("TaskScheduler"+key));
//移除触发器
scheduler.unscheduleJob(TriggerKey.triggerKey("TaskScheduler"+key));
return createTask(key,remindTime,remindStyle);
} catch (SchedulerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 移除定时任务
* @param key
* @return
*/
public Boolean removeTask(String key){
try {
SchedulerFactory schedulerFactory =new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 停止触发器
scheduler.pauseTrigger(TriggerKey.triggerKey("TaskScheduler"+key));
//移除触发器
scheduler.unscheduleJob(TriggerKey.triggerKey("TaskScheduler"+key));
return true;
} catch (SchedulerException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static String formatDateByPattern(Date date, Integer type){
SimpleDateFormat sdf=new SimpleDateFormat();
if(type==0){
sdf = new SimpleDateFormat("ss mm HH dd MM ? yyyy");//
}else if(type==1){
sdf= new SimpleDateFormat("ss mm HH * * ?");
}else if(type==2){
sdf= new SimpleDateFormat("ss mm HH ? * ? FRI");
}else if(type==3){
sdf= new SimpleDateFormat("ss mm HH L * ?");
}else {
sdf= new SimpleDateFormat("ss mm HH ? * MON-FRI");
}
String formatTimeStr = null;
if (date != null) {
formatTimeStr = sdf.format(date);
}
return formatTimeStr;
}
}
第三步 创建监听器
@Component
public class ScheduleTaskListener implements Job {
private Logger log= LoggerFactory.getLogger(ScheduleTaskListener.class);
@Override
public void execute(JobExecutionContext jobExecutionContext) {
try {
JobDataMap map=jobExecutionContext.getJobDetail().getJobDataMap();
String params = (String) map.get("parameter");//获取参数
Long remindStyle = (Long) map.get("remindStyle");
//可在此处写自己的业务逻辑
System.out.println(params+remindStyle);
} catch (Exception e) {
e.printStackTrace();
}
}
}
最后,通过调用createTask 方法 传入参数进行调用