Cron 表达式每年执行一次
Cron 表达式是一种时间表达方式,常用于定时任务的设置。每个表达式都由6个字段组成,分别表示分、时、日、月、周几、年,使用空格分隔。其中年字段可选,若省略则表示每年都执行。
本文将演示如何设置 Cron 表达式,使得任务每年只执行一次。
Cron 表达式语法
Cron 表达式的语法如下:
{秒} {分} {时} {日} {月} {周几} {年(可选)}
秒
(0-59)分
(0-59)时
(0-23)日
(1-31)月
(1-12)周几
(0-6,0表示星期天)年
(可选,1970-2099)
Cron 表达式中,每个字段可使用数字、星号、及逗号和连字符进行组合。例如:
0 0 12 * * ?
表示每天中午12点执行0/5 * * * * ?
表示每隔5秒钟执行一次0 0 0 1 * ?
表示每月1号执行0 0 0 1 1 ?
表示每年1月1日执行
每年某一天执行
为了让任务每年只执行一次,我们可以将月、周几和年字段指定为一个固定的值,而将日字段指定为我们希望执行的日期。
例如,若希望任务在每年的8月1日执行,则可使用以下 Cron 表达式:
0 0 0 1 8 ? *
该表达式中,第4个字段指定为1表示每月1日执行,第5个字段指定为8表示在8月执行,而年字段使用星号表示每年都执行。
使用示例
下面是一个使用 Quartz Scheduler 执行每年某一天任务的示例。假设我们需要在每年的6月1日执行任务,且任务需要执行10秒钟。
首先,我们需要添加依赖:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
然后编写任务类:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class YearlyTask implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Yearly task started.");
try {
Thread.sleep(10000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Yearly task completed.");
}
}
在该任务类中,我们编写了一个执行10秒钟的任务。
接下来,编写定时器的配置类:
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class SchedulerManager {
public static void start() throws SchedulerException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail job = JobBuilder.newJob(YearlyTask.class).withIdentity("yearlyTask").build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("yearlyTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 1 6 ? *"))
.build();
scheduler.scheduleJob(job, trigger);
scheduler.start();
}
}
在该类中,我们通过 StdSchedulerFactory 获取了一个 Scheduler 对象,并创建了一个名为 yearlyTask
的任务,并指定了它的执行类为 YearlyTask
。接着,我们创建了一个名为 yearlyTrigger
的触发器,并指定了它的 Cron 表达式为刚才介绍的每年6月1日。
最后,在 start 方法中,我们将任务和触发器添加到 Scheduler 中,并启动了 Scheduler。
最后,我们编写一个主函数来启动任务:
import org.quartz.SchedulerException;
public class Main {
public static void main(String[] args) throws SchedulerException {
SchedulerManager.start();
}
}
运行该程序,即可看到任务在每年的6月1日自动执行。
结论
本文介绍了如何使用 Cron 表达式实现每年只执行一次的定时任务。通过指定日期和时间字段,我们可以轻松地设置任务在每年特定的某一天执行。