本文已参与「新人创作礼」活动,一起开启掘金创作之路。
平时项目中有不少场景需要用到定时任务,以前的公司采用的自己开发的框架,可以通过数据库动态配置定时任务的触发时间,还有间隔任务的间隔周期。鉴于之前太过懒惰,没有自行去认真研究过开源的定时任务框架,遂特此记录一下基于SpringBoot项目的简单定时(间隔)任务。
首先创建一个定时(间隔)任务的配置文件,用于定义每个任务的间隔时间。我这里取名就叫task-config.ini了,放置于resources路径下。
内容如下:
lineAllCity.cron = */30 * * * * ?
上文中定义的时间间隔为30秒执行一次
接着编写间隔任务类:
package com.wl.standard.task;
import com.wl.standard.entity.City;
import com.wl.standard.service.CityService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.scheduling.annotation.Scheduled;
import java.util.List;
/**
* 间隔任务
* @author wl
* @date 2021/12/23
*/
@Configuration
@Slf4j
@PropertySource("classpath:/task-config.ini")
public class IntervalTask {
private final CityService cityService;
@Autowired
public IntervalTask(CityService cityService) {
this.cityService = cityService;
}
@Scheduled(cron = "${lineAllCity.cron}")
public void list() {
List<City> cityList = cityService.getAllCity();
log.info("城市数量: {}", cityList.size());
}
}
其中@PropertySource的作用为加载指定的属性文件,@Scheduled作用为spring定时器(定时执行一次或定时轮询执行一段代码),cron表达式定义了方法执行的时间规则。
最后记得在启动类上要加上@EnableScheduling注解。
package com.wl.standard;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import springfox.documentation.oas.annotations.EnableOpenApi;
@SpringBootApplication
@MapperScan("com.wl.standard.mapper")
@EnableOpenApi
@EnableScheduling
public class Application {
public static void main( String[] args ){
SpringApplication.run(Application.class, args);
System.out.println("(〃'▽'〃)SpringBoot启动成功!!!");
}
}
间隔任务执行效果: