项目场景:
定时任务在每天查找过期数据,并存入过期数据待查表。
一、定时任务的几种实现方式
在JAVA开发领域,目前可以通过以下几种方式进行定时任务:
1、Timer:jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行。提供的功能比较单一,无法实现复杂的调度任务。
2、ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。
3、Spring Task:Spring提供的一个任务调度工具,支持注解和配置文件形式,支持Cron表达式,使用简单且功能强大。
4、Quartz:一款功能强大的任务调度器,可以实现较为复杂的调度功能,如每月一号执行、每天凌晨执行、每周五执行等等,还支持分布式调度,就是配置稍显复杂。
二、SpringBoot中定时任务使用
1、引入依赖 只需要引入spring-boot-starter依赖就可以。
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> </dependencies>
2、 开启定时任务
在需要开启定时任务的类上面加上@EnableScheduling注解即可开启定时任务。
@Service @EnableScheduling public class CoreTask { private static Logger logger = LoggerFactory.getLogger(CoreTask.class); @Autowired IManageLibraryService manageLibraryService; @Autowired ManageLibraryDao manageLibraryDao; @Scheduled(cron = "0 0 * * * *") public void findOutDate() { manageLibraryService.handle(LocalDate.now().plusDays(0).toString()); } @Scheduled(cron = "0 58 23 * * ?") //@Scheduled(cron = " 0/1 * * * * ?") public void scanLibraryOutDate() { //查询过期数据 List<Map> outDateLists = manageLibraryService.queryOutDateList(); outDateLists.forEach(item -> { Map map = new HashMap<>(); map.put("valid", 0); map.put("id", item.get("id")); // manageLibraryDao.updateValid(map); //临时注释 // manageLibraryDao.insertToLibraryOutDate(map);//临时注释 }); } }
3. 创建定时任务
在要执行定时任务的方法上加上注解
@Scheduled(cron = " 0/1 * * * * ?") 这里是每秒执行一次
4. cron属性.
cron表达式属性如下:
second(秒), minute(分), hour(时),day of month(日),month(月),day of week(周几)
示例如下:
0 0 0 * * * – 每天零时执行一次
0 0/15 14,18 * * ? – 每天14点整和18点整,每隔15分钟执行一次
0 15 10 ? * 1-6 – 每个月的周一到周六 10:15分执行一次
0 0 2 ? * 6L – 每个月的最后一个周六凌晨2点执行一次
0 0 2 LW * ? – 每个月的最后一个工作日凌晨2点执行一次
0 0 2-4 ? * 1#1 – 每个月的第一个周一凌晨2点到4点期间,每个整点都执行一次
5. Cron表达式生成工具地址:http://qqe2.com/cron
6.sql语句
select id FROM library WHERE date_add(validDate,interval ( SELECT period FROM library_config ) month)< now();
DATE_ADD() 函数向日期添加指定的时间间隔。
语法
DATE_ADD(date,INTERVAL expr type)
date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。
type 参数可以是下列值:
Type 值:
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH
interval 1 month
追加一个月
DATE_ADD() 详细参考连接https://www.w3school.com.cn/sql/func_date_add.asp