说明下,这里是单机版的,真正分布式应该建立定时任务调度中心,直接上代码了
package com.bzl.face.system.schedule;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledFuture;
/**
* 单机版定时任务:futureGroup 定时任务Map集合,key为任务名称
* taskGroup 任务集合,key为任务名称,value为具体任务
* 任务名称不能重复,统一在TaskEnum中枚举
*
* @author wuyp
* @date 2019/10/22 10:15
*/
@Slf4j
@Component
public class ScheduleTask {
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
private Map<String, ScheduledFuture<?>> futureGroup = new HashMap<>(16);
private Map<String,Runnable> taskGroup = new HashMap<>(16);
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
/**
* 启动定时任务 (若任务名相同,则覆盖之前的任务)
**/
public void startCron(String name, Runnable task, String cron) {
stopCron(name);
ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(task, new CronTrigger(cron));
futureGroup.put(name, future);
taskGroup.put(name, task);
log.info(String.format("scheduled task: [%s] start success", name));
}
/**
* 停止任务
**/
public void stopCron(String name) {
ScheduledFuture<?> future = futureGroup.get(name);
if (future != null) {
future.cancel(true);
log.info(String.format("scheduled task: [%s] stop success", name));
}else {
log.error(String.format("scheduled task: [%s] not exist", name));
}
}
/**
* 变更任务间隔,再次启动 先停止,在开启.
**/
public void changeCron(String name, String cron){
stopCron(name);
ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(taskGroup.get(name), new CronTrigger(cron));
futureGroup.put(name, future);
log.info(String.format("scheduled task: [%s] change success", name));
}
}
TaskEnum类:
package com.bzl.face.common.enums;
/**
* 定时任务枚举
* @author wuyp
* @date 2019-11-20 20:41
*/
public enum TaskEnum {
/**
* 火警通知任务
*/
FIRE_ALARM("火警通知定时任务");
private String value;
TaskEnum(String value) {
this.value = value;
}
}
使用部分代码:
@Autowired
private ScheduleTask scheduleTask;
@PostMapping(value = {"/jsontest"})
@ResponseBody
public ResultBean jsontest(@RequestBody JSONObject json){
String cron = json.getString("cron");
scheduleTask.startCron(TaskEnum.FIRE_ALARM.name(), this::fireAlarm, cron);
return ResultBean.success();
}
@PostMapping(value = {"/jsontest2"})
@ResponseBody
public ResultBean jsontest2(@RequestBody JSONObject json) throws Exception{
String cron = json.getString("cron");
scheduleTask.changeCron(TaskEnum.FIRE_ALARM.name(), cron);
Thread.sleep(30000);
scheduleTask.stopCron(TaskEnum.FIRE_ALARM.name());
return ResultBean.success();
}
private void fireAlarm() {
System.out.println(">>>>>>>>>>>> 任务1执行。。," + DateUtil.now());
}
测试通过,喜欢的朋友直接用吧,至于异常方面,可以里面去捕获,可以抛出来外面再处理,都可以