前言
Java 中定时任务使用的最多的我想就是 quartz 了,但是这个框架太过庞大,而且我也不需要用到这么多东西,使用方法也是比较复杂 。
Hutool的定时任务模块与 Linux 的 Crontab 使用上非常类似,通过一个 cron.setting 配置文件,简单调用start()方法即可简单使用。
以上是官网原话
使用
1.引入以下依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.8</version>
</dependency>
2.配置文件
对于 Maven 项目,首先在 src/main/resources/config 下放入cron.setting文件
# 我是注释
[com.company.aaa.job]
TestJob.run = */10 * * * *
TestJob2.run = */10 * * * *
中括号表示分组,也表示需要执行的类或对象方法所在包的名字,这种写法有利于区分不同业务的定时任务。
TestJob.run 表示需要执行的类名和方法名
3.启动
public static void main(String[] args) {
try {
ConfigurableApplicationContext context = SpringApplication.run(HoiApplication.class, args);
//支持秒级别定时任务
CronUtil.setMatchSecond(true);
//启动
CronUtil.start();
}catch ( Exception e){
e.printStackTrace();
}
}
踩坑
先看看TestJob的内容
public class TestJob{
@Resource
UserService userService;
public void run(){
userService.updateStatus(userId);
}
}
结果发现运行程序报错,原因是不支持依赖注入,无法使用updateStatus
解决方式如下:
新建一个SpringBeanUtil工具
@Component
public class Spring BeanUtil {
private static ConfigurableApplicationContext applicationContext = null;
public static void setApplicationContext(ConfigurableApplicationContext context) {
if (null == SpringBeanUtil.applicationContext) {
SpringBeanUtil.applicationContext = context;
}
}
public static ConfigurableApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
public static<T> T getBean(Class<T> cls) {
return getApplicationContext().getBean(cls);
}
}
修改启动类
public static void main(String[] args) {
try {
ConfigurableApplicationContext context = SpringApplication.run(DlApplication.class, args);
SpringBeanUtil.setApplicationContext(context);
//支持秒级别定时任务
CronUtil.setMatchSecond(true);
CronUtil.start();
}catch (Exception e){
e.printStackTrace();
}
}
再次调整TestJob
public class TestJob{
public void run(){
ConfigurableApplicationContext context = SpringBeanUtil.getApplicationContext();
if (!Objects.isNull(context)){
UserService userService = context.getBean(UserService.class);
userService.updateStatus(userId);
}
}
}