SpringBoot使用@Scheduled定时任务录入将要过期任务数据

简介: SpringBoot使用@Scheduled定时任务录入将要过期任务数据

项目场景:

定时任务在每天查找过期数据,并存入过期数据待查表。

一、定时任务的几种实现方式

在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


相关文章
|
5天前
|
NoSQL Java 数据库
SpringBoot实用开发篇第三章(数据层解决方案操作)
SpringBoot实用开发篇第三章(数据层解决方案操作)
|
3天前
|
Java 数据库连接 数据库
实现Spring Boot与MyBatis结合进行数据库历史数据的定时迁移
实现Spring Boot与MyBatis结合进行数据库历史数据的定时迁移
13 2
|
4天前
|
easyexcel Java API
SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出
SpringBoot集成EasyExcel 3.x:高效实现Excel数据的优雅导入与导出
16 1
|
14天前
|
Java 调度 Spring
SpringBoot多个@Scheduled注解的方法,会阻塞吗
【6月更文挑战第9天】SpringBoot多个@Scheduled注解的方法,会阻塞吗
20 5
|
12天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的共享单车数据存储系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的共享单车数据存储系统附带文章源码部署视频讲解等
11 1
|
4天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的个人健康数据管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的个人健康数据管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
|
19天前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp小程序的旅游数据附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp小程序的旅游数据附带文章源码部署视频讲解等
13 0
|
缓存 Java 数据库
SpringBoot系统启动任务(三十二)的方式(上)
SpringBoot系统启动任务(三十二)的方式(上)
225 0
SpringBoot系统启动任务(三十二)的方式(上)
|
2天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的轻院网购商城管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的轻院网购商城管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
28 5
|
2天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue的隔离人员的管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的隔离人员的管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
21 3