SpringBoot+Quartz实现简单定时任务(Corn表达式方式)

一、 SpringBoot实现简单的定时任务

1简单的小demo

a、在springboot的启动类上,加上注解@EnableScheduling


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling   定时的注解
public class AdminApplication {

    public static void main(String[] args) {
        SpringApplication.run(AdminApplication.class, args);
    }


}

 b、编写测试类


@Component
public class Schedule {
    Logger log = LoggerFactory.getLogger(Schedule.class);

    //cron表达式:每隔5秒执行一次
    @Scheduled(cron = "0/5 * * * * *")
    public void scheduled(){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("hh点mm分ss秒");
        // 将date日期解析为字符串
        String date = simpleDateFormat.format(new Date());
        log.info("当前时间:" + date);
    }

}

c、运行结果

 

 2、手写corn生成工具类

a、创建CronEntity实体(需要导入Lombok的依赖)


import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
@EqualsAndHashCode()
public class CronEntity  {
    /**
     * 周期: DAY:每天,WEEK:每周,MONTH:每月
     */
    String cycle;

    /** 一周的哪几天 */
    String[] dayOfWeeks;

    /** 一个月的哪几天 */
    String[] dayOfMonths;

    /** 频次,一天执行多少次 */
    Integer frequency;

    /** 时 */
    Integer hour;

    /** 分 */
    Integer minute;

}

b、编写工具类 CronUtil


import lombok.extern.slf4j.Slf4j;

/**
 * 构建日周月的Cron表达式
 */
@Slf4j
public class CronUtil {

    public static String createCronExp(CronEntity cronEntity){
        StringBuffer cronExp = new StringBuffer("");
        if (cronEntity.getFrequency() == null){
            cronEntity.setFrequency(1);
        }
        if (null != cronEntity.getMinute() && null != cronEntity.getHour()) {
            cronExp.append(0).append(" ");
            cronExp.append(cronEntity.getMinute()).append(" ");
            cronExp.append(cronEntity.getHour()).append(" ");
            if(cronEntity.getCycle().equals("DAY")){
                cronExp.append("*/").append(cronEntity.getFrequency()).append(" ");
                cronExp.append("* ");
                cronExp.append("?");
            }
            else if(cronEntity.getCycle().equals("WEEK")){
                cronExp.append("? ");
                cronExp.append("* ");
                String[] weeks = cronEntity.getDayOfWeeks();
                for(int i = 0; i < weeks.length; i++){
                    if(i == 0){
                        cronExp.append(weeks[i]);
                    } else{
                        cronExp.append(",").append(weeks[i]);
                    }
                }
            }
            else if(cronEntity.getCycle().equals("MONTH")){
                String[] days = cronEntity.getDayOfMonths();
                for(int i = 0; i < days.length; i++){
                    if(i == 0){
                        cronExp.append(days[i]);
                    } else{
                        cronExp.append(",").append(days[i]);
                    }
                }
                cronExp.append(" * ");
                cronExp.append("?");
            }
        }else {
            cronExp.append("Missing time parameter");
            log.info("分钟小时参数未设置");
        }
        return cronExp.toString();
    }

 c、测试

    //测试
    public static void main(String[] args) {
        CronEntity cronEntity = new CronEntity();
        cronEntity.setCycle("WEEK");
        String[] str = {"2","3"};
        cronEntity.setDayOfWeeks(str);
        cronEntity.setMinute(20);
        cronEntity.setHour(12);
        String cronExp = createCronExp(cronEntity);
        log.info(cronExp);  //0 20 12 ? * 2,3  每周二周三的12点20份执行
    }

 3、常用的Corn表达式

  • 每隔5秒执行一次:*/5 * * * * ?
  • 每隔1分钟执行一次:0 */1 * * * ?
  • 每小时的20分执行一次:0 20 * * * ?
  • 每天的两点35分执行一次:0 35 2 * * ?
  • 每月的1日的凌晨2点调整任务:0 0 2 1 * ? *
  • 每天上午10点,下午2点,4点 执行一次:0 0 10,14,16 * * ?
  • 每周星期天凌晨1点实行一次 :0 0 1 ? * L

二、Quartz(更强大)简介:

1,Job 表示一个工作,要执行的具体内容。此接口中只有一个方法
2,JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
3,Trigger 代表一个调度参数的配置,什么时候去调。
4,Scheduler 代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。当 Trigger 与 JobDetail 组合,就可以被 Scheduler 容器调度了。

a、导入依赖

       <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.1</version>
        </dependency>
 

b、编写任务,继承QuartzJobBean

public class CornOfCopyDB extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        log.info(jobExecutionContext.getFireInstanceId());
        //执行的任务逻辑...

    }

c、绑定JobDetail 和 Trigger并执行任务

@Configuration
public class QuartzConfiguration {

    @Value("${corn}")
    private String corn;


    // 使用jobDetail包装job
    @Bean
    public JobDetail CornOfCopyDBDetail() {
        return JobBuilder.newJob(CornOfCopyDB.class).withIdentity("CornOfCopyDB").storeDurably().build();
    }

    // 把jobDetail注册到Cron表达式的trigger上去
    @Bean
    public CronTrigger CornOfCopyDBTrigger() {
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(corn);
        return TriggerBuilder.newTrigger()
                .forJob(CornOfCopyDBDetail())
                .withIdentity("CornOfCopyDBTrigger")
                .withSchedule(cronScheduleBuilder)
                .build();
    }
}

 自己实现的自定义开启定时任务:

public class QuartzUtils {
    //StdSchedulerFactory工厂
    private static StdSchedulerFactory schedulerFactory = new StdSchedulerFactory();

    public static Scheduler startJob(String name,String cron) throws SchedulerException, ClassNotFoundException {
        Class clazz = Class.forName(name);
        //封装信息
        JobDataMap jobDataMap = new JobDataMap();
        jobDataMap.put("name", name);

        //创建jobDetail
        JobDetail jobDetail = newJob(clazz)
                .usingJobData(jobDataMap)
                .build();

        //创建cronScheduleBuilder
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);

        //创建trigger
        CronTrigger cronTrigger = TriggerBuilder.newTrigger()
                .withIdentity(name)
                .withSchedule(cronScheduleBuilder)
                .build();

        //配置scheduler,绑定任务和触发器
        Scheduler scheduler = schedulerFactory.getScheduler();
        //绑定任务和触发器
        scheduler.scheduleJob(jobDetail, cronTrigger);

        return scheduler;
    }
}

定时任务精讲请看:

Spring Job?Quartz?XXL-Job?年轻人才做选择~

Guess you like

Origin blog.csdn.net/weixin_52540274/article/details/119759565