@RestController
@RequestMapping("/api")
public class Controller {
private final Logger logger = LoggerFactory.getLogger(Controller.class);
@Autowired
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
return new ThreadPoolTaskScheduler();
}
private Map<Integer, ScheduledFuture<?>> taskMap = new HashMap<>();
/**
* 开启方案,并且手动触发定时任务
*
* @return
*/
@PostMapping("/startScheduler/{id}")
public Map<String, Object> startScheduler(@PathVariable Integer id) {
logger.info("REST request to startScheduler===>:" + id);
Map<String, Object> result = new HashMap<>();
//业务代码已删除,这里只展示定时任务相关代码
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ScheduledFuture<?> future = startCron(planId, taskIds, timeIntervalStr);
taskMap.put(id, future);
result.put("code", 0);
result.put("msg", msg);
return result;
}
//开启定时任务
public ScheduledFuture<?> startCron(String planId, String taskIds, String timeIntervalStr) {
ScheduledFuture<?> future = threadPoolTaskScheduler.schedule(new TaskJob(planId, taskIds, timeIntervalStr), new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
//10s触发执行一次
return new CronTrigger("0/10 * * * * *").nextExecutionTime(triggerContext);
}
});
logger.info("---------定时任务开始执行-------");
return future;
}
/**
* 停止方案,并且关闭定时任务
*
* @param id
* @return
*/
@PostMapping("/stopScheduler/{id}")
public Map<String, Object> stopScheduler(@PathVariable Integer id) {
logger.info("REST request to stopScheduler===>:" + id);
Map<String, Object> result = new HashMap<>();
//业务代码已删除,这里只展示定时任务相关代码
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//关闭定时任务
boolean flag = stopCron(id);
if (flag) {
result.put("code", 0);
result.put("msg", "关闭该方案的定时任务成功");
} else {
result.put("code", 0);
result.put("msg", "定时任务已不存在");
}
return result;
}
//根据id关闭指定的定时任务
public boolean stopCron(Integer id) {
ScheduledFuture<?> scheduledFuture = taskMap.get(id);
if (null == scheduledFuture) {
return false;
}
scheduledFuture.cancel(true);
taskMap.remove(id);
return true;
}
}
public class TaskJob implements Runnable {
private final Logger logger = LoggerFactory.getLogger(TaskJob.class);
private String planId;
private String taskIds;
private String timeIntervalStr;
public TaskJob(String planId, String taskIds, String timeIntervalStr) {
this.planId = planId;
this.taskIds = taskIds;
this.timeIntervalStr = timeIntervalStr;
}
//注意此处不能使用@Autowired注入
//因为Scheduled的加载时机要早于Autowired,定时任务会开启一个新的进程,
//而spring值会注入到初始的类中,但这个有值类并没有被使用,而是调用了无值的类。
private final PaTaskService paTaskService = ApplicationContextUtil.getBean(PaTaskService.class);
private final PaTaskController paTaskController = ApplicationContextUtil.getBean(PaTaskController.class);
@Override
public void run() {
//写定时任务逻辑
}
}