Springboot实现定时任务

举报
Java李杨勇 发表于 2022/08/31 20:42:03 2022/08/31
【摘要】 一般来说java的SpringBoot创建定时任务主要有三种实现方式:一、基于注解(@Scheduled):基于注解@Scheduled默认基于为单线程,开启多个任务时候任务的执行时机会受上一个任务执行时间的影响,二、基于接口SchedulingConfigurer来实现从数据库获取指定时间来动态执行定时任务计划三、基于注解设定多线程定时任务本文主要讲解基于Springboot的SaticS...

一般来说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天

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。