Springboot实现定时任务

140 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第26天,点击查看活动详情

一般来说java的SpringBoot创建定时任务 主要有三种实现方式: 一、基于注解(@Scheduled):基于注解@Scheduled默认基于为单线程,开启多个任务时候任务的执行时机会受上一个任务执行时间的影响, 二、基于接口SchedulingConfigurer来实现从数据库获取指定时间来动态执行定时任务计划 三、基于注解设定多线程定时任务

本文主要讲解基于Springboot的SaticScheduleTask来执行定时任务操作。  

常用的Cron表达式参数如下大家应该都不陌生:

  • 秒(0~59) 例如0/5表示每5秒
  • 分(0~59)
  • 时(0~23)
  • 日(0~31)的某天,需计算
  • 月(0~11)

使用@Scheduled 注解很方便能够很方便的执行定时和延时任务。springboot的定时任务默认是单线程

package com.yt.common.util;

import com.yt.exam.biz.ExamPlanBiz;
import com.yt.exam.biz.ExamRecordBiz;
import com.yt.exam.ctrl.vo.ExamRecordVo;
import com.yt.exam.entity.ExamPlan;
import com.yt.exam.entity.ExamRecord;
import com.yt.exam.enums.ExamStatusEnum;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.List;

@Configuration      //1.主要用于标记配置类,兼备Component的效果。
public class SaticScheduleTask implements ApplicationContextAware {

    @Autowired
    @SuppressWarnings("all")
    private  ExamPlanBiz examPlanBiz;

    @Autowired
    @SuppressWarnings("all")
    private ExamRecordBiz examRecordBiz;

    //3.添加定时任务每分钟执行
    @Scheduled(cron = "0 */1 * * * ?")
    private  void configureTasks() {
        //从数据库获取数据
        List<ExamPlan> examPlans = examPlanBiz.loadAll();
        long epochSecond = LocalDateTime.now().atZone(ZoneId.of("Asia/Shanghai")).toInstant().getEpochSecond()*1000;
        for (int i = 0; i <examPlans.size() ; i++) {
            ExamPlan examPlan = examPlans.get(i);
            if(epochSecond >= examPlan.getEndTime().getTime()){
                 List<ExamRecordVo> examRecordVos=examRecordBiz.getExamRecordList(examPlan.getId());
                for (int j = 0; j <examRecordVos.size() ; j++) {
                    //修改用户考试状态
                    ExamRecordVo recordVo = examRecordVos.get(j);
                    if(recordVo.getStatus()== ExamStatusEnum.WAIT.getCode()){//待考
                        ExamRecord examRecord =new ExamRecord();
                        examRecord.setId(recordVo.getRecordId());
                        examRecord.setStatus(ExamStatusEnum.ABSENT.getCode());//缺考
                        examRecordBiz.update(examRecord);
                    }
                }
             }
        }
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    }

}

这里@Configuration配置类交给spring容器管理!项目启动就能执行,加载定时任务执行方法批量执行业务定时操作。

大家点赞、收藏、关注、评论啦 、打卡 文章 更新 268/  365天