这里主要测试使用两种,一种config配置文件形式的,一种接口触发式的,应对不同的场景:根据业务场景进行选择。
配置文件方式
1.在resources 新建配置文件
#分组定时任务
#需要执行定时任务的包
#[com.smy.system.service]
#每分钟执行一次
#JobTask.createJob=* */1 * * *
#JobTask.createJobTest1=* */1 * * *
#单个定时任务
com.smy.system.service.JobTask.createJobTest1=* */1 * * *
2.service
package com.smy.system.service;
/**
* @ClassName JobTask
* @Description cron定时任务
* @Author zxr
* @Date 2024/7/25
*/
public class JobTask {
public void createJob(){
System.err.println("job任务测试");
}
public void createJobTest1(){
System.err.println("createJobTest任务测试");
}
}
3.启动类添加定时任务配置
public class SmyApplication {
public static void main(String[] args) {
// System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(SmyApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ smy项目启动成功 ლ(´ڡ`ლ)゙ \n");
// 开启秒级定时任务
CronUtil.setMatchSecond(true);
//启动定时任务
CronUtil.start();
// 使用deamon模式,将定时任务设置为守护线程,此模式下会在 调用stop时 立即停止所有作业线程,这种情况下,任务是可以中断的,慎用
// CronUtil.start(true);
}
}
接口触发式:
cron表达式由接口传递,需要什么时候执行,由操作人员决定
cron表达式:*/1 * * * *
对应触发接口和方法:
contrller
@Api(tags = "触发式接口任务管理")
@RestController
@RequestMapping("/job/")
public class JobController {
@Resource
JobTask jobTask;
@PostMapping("test")
@ApiOperation("jobTest")
public void test(@RequestBody JobReq req) {
if (StringUtils.isBlank(req.getCron())) throw new ServiceException("定时任务表达式不能为空", HttpStatus.ERROR);
// 触发定时任务
jobTask.executeTask(req.getCron());
}
}
service:
public void executeTask(String cron){
//动态配置定时任务,因为项目启动时已经启动定时任务服务,所以新增cron表达式立即触发执行
String jobId= CronUtil.schedule(cron, (Task) () -> System.err.println("接口触发时定时任务执行"));
//执行完停止对应定时任务
CronUtil.remove(jobId);
System.err.println("执行完停止对应定时任务:"+jobId);
}