您的位置:

cron解析

一、cron表达式概述

cron表达式是一种用来配置计划任务的字符串表达式,由6个字段组成,每个字段描述了计划任务中的一个时间段,分别表示分钟、小时、日、月、周、年。一个cron表达式的格式如下:

*    *    *    *    *    *
┬    ┬    ┬    ┬    ┬    ┬
│    │    │    │    │    │
│    │    │    │    │    └ year (optional)
│    │    │    │    └───── day of week (0 - 6) (Sunday to Saturday)
│    │    │    └────────── month (1 - 12)
│    │    └─────────────── day of month (1 - 31)
│    └──────────────────── hour (0 - 23)
└───────────────────────── minute (0 - 59)

如上所示,cron表达式有6个字段,每个字段用空格来分隔。每个字段都有它自己的符号来表示它所代表的时间段,由于cron表达式中允许使用的值及符号较多,因此需要对每个字段进行详细解析。

二、cron表达式字段详解

1.分钟字段

分钟字段可以设置0-59的任何值,或者使用特殊字符。特殊字符可以是:

  • *: 匹配任意值,表示每分钟都匹配
  • ,: 分隔符,可以指定多个值,例如:1,5,10表示在第1、5、10分钟执行
  • -: 范围符,可以指定一个范围内的值,例如:5-15表示在第5到15分钟之间执行
  • /: 步长符,可以指定一个初始值,后面每隔一定时间执行一次,例如:0/15表示从0分钟开始,每隔15分钟执行一次

例如:*/5 * * * * *表示在每5分钟时执行一次任务。

2.小时字段

小时字段可以设置0-23的任何值,也可以使用特殊字符。特殊字符有和分钟字段一样的4种,用法也相同。例如:0 1-5 * * * *表示在早上1到5点之间每分钟执行一次任务。

3.日字段

日字段可以设置1-31的任何值,也可以使用特殊字符。特殊字符有:*,-/?,其中?表示不指定,只能在日和周字段中使用。例如:0 0 10 1-15 * *表示在每个月的1-15日的10点执行任务。

4.月字段

月字段可以设置1-12的任何值,也可以使用特殊字符。特殊字符有:*,-/ 以及 JAN-DEC 十二个英文单词。例如:0 0 0 1 JAN,FEB,MAR * *表示在每年的1月、2月、3月第一天的0点0分执行任务。

5.周字段

周字段可以设置0-7(0和7表示周日),可以使用0或7,也可以使用特殊字符。特殊字符有:*,-/L# 以及 MON-SUN 七个英文单词。例如:0 0 0 * * 1-5表示在周一到周五的0点0分执行任务。

6.年字段

年字段可以设置1970年到2099年的任何值,可以使用4位数字表示年,也可以使用特殊字符。特殊字符有:*,-/,例如:0 0 0 1 1 *表示每年1月1日0点0分执行任务。

三、cron表达式的Java实现

在Java中,可以使用Quartz框架来处理cron表达式,主要涉及到两个类:

  • CronTriggerImpl:用于配置和管理计划任务的触发条件,其中包括cron表达式等信息;
  • SimpleTriggerImpl:用于在特定的时间触发任务。

以下是一个示例,其中定义了一个在每天12:30执行的任务:

public class CronTriggerExample {
    public static void main(String[] args) {
        JobDetail jobDetail = newJob(MyJob.class).withIdentity("myJob").build();
        CronTrigger cronTrigger = newTrigger().withIdentity("myCronTrigger")
                .withSchedule(cronSchedule("0 30 12 * * ?"))
                .build();
        StdSchedulerFactory factory = new StdSchedulerFactory();
        try {
            Scheduler scheduler = factory.getScheduler();
            scheduler.scheduleJob(jobDetail, cronTrigger);
            scheduler.start();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
}

其中MyJob类是需要执行的任务类,需要实现Job接口:

public class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("Hello, world!");
    }
}

这段代码实现了在每天12:30执行任务MyJob,使用StdSchedulerFactory获取一个scheduler实例,然后将jobDetail和cronTrigger进行关联后启动。

四、总结

cron表达式是一种用来配置计划任务的字符串表达式,由6个字段组成,每个字段描述了计划任务中的一个时间段。在Java中可以使用Quartz框架来处理cron表达式,使用CronTriggerImplSimpleTriggerImpl两个类来配置和管理任务的触发条件。