Cron 表达式每年执行一次

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 表达式实现每年只执行一次的定时任务。通过指定日期和时间字段,我们可以轻松地设置任务在每年特定的某一天执行。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程