- 需要在一个小型项目中加入定时任务,发现了简洁易上手的方法:使用Hutool工具包的CronUtil工具类
- 官网链接:使用指南 | API文档
======================================================== - maven依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.4</version>
</dependency>
动态添加
- 在添加了@SpringBootApplication注解的启动类中启动全局定时任务:
@SpringBootApplication
@AllArgsConstructor
public class DemoAppliction {
private static JobProperties jobProperties;
private static IJobService jobService;
public static JobProperties getJobProperties() {
if (jobProperties == null) {
jobProperties = SpringUtil.getBean(JobProperties.class);
}
return jobProperties;
}
private static IJobService getJobService() {
if (jobService == null) {
jobService = SpringUtil.getBean(IJobService.class);
}
return jobService;
}
public static void main(String[] args) {
SpringApplication.run(DemoAppliction.class, args);
if (getJobProperties().getEnable()) {
//开启全局定时任务
CronUtil.setMatchSecond(true);
CronUtil.start();
//调用业务层方法
getJobService().start();
}
}
}
- 增加业务层接口和实现类
public interface IJobService {
/**
* 开启任务
*
* @return
*/
String start();
/**
* 关闭任务
*
* @param jobId
* @return
*/
boolean stop(String jobId);
}
@Slf4j
@Service
@AllArgsConstructor
public class JobServiceImpl implements IJobService {
private final IWorkService workService;
@Override
public String start() {
log.info("开启定时任务");
return work();
}
private String work() {
String jobId = UUID.randomUUID().toString();
String schedulingPattern = "0 0 * * * ?";
//新增定时任务
CronUtil.schedule(jobId, schedulingPattern, () -> {
log.info("【{}】执行定时任务【{}】", DateUtil.now(), jobId);
workService.work();
});
return jobId;
}
@Override
public boolean stop(String jobId) {
log.info("关闭定时任务【{}】", jobId);
return CronUtil.remove(jobId);
}
}
静态设置
- 增加配置文件:在src/main/resources/config下新增cron.setting文件
# 包名
[com.xxx.service.impl]
# 实现类类名和方法名 定时任务执行时间表达式
JobServiceImpl.work = 0/10 * * * * ?
JobServiceImpl.work1= 0/20 * * * * ?
- 在添加了@SpringBootApplication注解的启动类中启动全局定时任务:
@SpringBootApplication
@AllArgsConstructor
public class DemoAppliction {
public static void main(String[] args) {
SpringApplication.run(DemoAppliction.class, args);
//开启全局定时任务
CronUtil.setMatchSecond(true);
CronUtil.start();
}
}
- 新增业务实现类及执行方法
@Slf4j
@Service
public class JobServiceImpl {
public void work() {
log.info("执行方法work");
}
public void work1() {
log.info("执行方法work1");
}
}
- 总结
动态添加方法可以灵活的添加或停止定时任务;
静态定义方法有助于统一管理定时任务的执行时间。