Java 基础教程

Java 面向对象

Java 高级教程

Java 笔记

Java FAQ

java cron获取上一个有效执行日期


要获取 Java 中 Cron 表达式的上一个有效执行日期,可以使用不同的方式实现。以下是两种常见的实现方式,一种是使用第三方库 Quartz Scheduler,另一种是使用 Java 内置的 ScheduledExecutorService 和自定义逻辑。

使用 Quartz Scheduler

步骤流程:

添加 Quartz Scheduler 依赖。

Maven 依赖坐标:

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

Gradle 依赖坐标:

implementation 'org.quartz-scheduler:quartz:2.3.2'

创建一个 Java 类来配置 Quartz Scheduler,并定义任务(Job)和触发器(Trigger)。

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

public class CronScheduler {
    public static void main(String[] args) throws SchedulerException {
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();

        JobDetail jobDetail = JobBuilder.newJob(MyJob.class)
                .withIdentity("myJob")
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger")
                .withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 * * ?")) // 设置Cron表达式
                .build();

        scheduler.scheduleJob(jobDetail, trigger);
        scheduler.start();

        // 获取上一个有效执行日期
        TriggerKey triggerKey = TriggerKey.triggerKey("myTrigger");
        Trigger triggerFromScheduler = scheduler.getTrigger(triggerKey);
        Date previousFireTime = triggerFromScheduler.getPreviousFireTime();

        System.out.println("上一个有效执行日期: " + previousFireTime);
    }

    public static class MyJob implements Job {
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            // 执行任务的逻辑
        }
    }
}

这个示例中,我们首先创建了一个 Quartz Scheduler 实例,然后配置了一个 Job 和一个 Trigger,其中 Trigger 使用了 Cron 表达式来定义执行计划。最后,我们通过获取 Trigger 的上一个有效执行日期来得到所需的结果。

使用 ScheduledExecutorService 和自定义逻辑

步骤流程:

创建一个 Java 类,使用 ScheduledExecutorService 来执行定时任务,并编写自定义逻辑以计算上一个有效执行日期。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class CronExecutor {
    public static void main(String[] args) {
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);

        // 定义Cron表达式
        String cronExpression = "0 0 12 * * ?";

        // 获取上一个有效执行日期
        long initialDelay = calculateInitialDelay(cronExpression);
        executorService.scheduleAtFixedRate(() -> {
            Date previousValidExecutionDate = calculatePreviousValidExecutionDate(cronExpression);
            System.out.println("上一个有效执行日期: " + previousValidExecutionDate);
        }, initialDelay, 24, TimeUnit.HOURS); // 每天检查一次

        // 等待程序运行
        executorService.shutdown();
    }

    private static long calculateInitialDelay(String cronExpression) {
        // 计算初始延迟,使其在下一个Cron触发之前
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
            Date now = new Date();
            Date nextValidExecutionDate = new CronExpression(cronExpression).getNextValidTimeAfter(now);
            return nextValidExecutionDate.getTime() - now.getTime();
        } catch (ParseException e) {
            throw new IllegalArgumentException("无效的Cron表达式", e);
        }
    }

    private static Date calculatePreviousValidExecutionDate(String cronExpression) {
        // 计算上一个有效执行日期
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("ss mm HH dd MM ? yyyy");
            Date now = new Date();
            Date previousValidExecutionDate = new CronExpression(cronExpression).getPreviousValidTimeBefore(now);
            return previousValidExecutionDate;
        } catch (ParseException e) {
            throw new IllegalArgumentException("无效的Cron表达式", e);
        }
    }
}

在这个示例中,我们使用 ScheduledExecutorService 来定期执行一个任务,该任务计算上一个有效执行日期。首先,我们计算初始延迟,以确保在下一个 Cron 触发之前执行第一次任务。然后,我们计算上一个有效执行日期。

无论使用哪种方式,都可以获得 Cron 表达式的上一个有效执行日期。选择哪种方式取决于您的项目需求和偏好以及是否想要使用 Quartz Scheduler 这样的第三方库。

在Java中获取当前日期的年、月、日有多种实现方式,以下是几种常见的方法:###方法1:使用java.Calendar`类是Java提供的用 ...
###方法一:Java8LocalDate类这是Java8中引入的日期和时间API。Maven坐标:Gradle坐标:实现过程:该方法使用循 ...
以下是一些常见的实现方式,以及它们的步骤流程、示例代码以及相关的Maven和Gradle依赖坐标。使用`thenApply()`、`then ...
###方式一:通过修改JobDetail的Cron表达式添加Maven依赖(Quartz):创建一个Job类:创建QuartzSchedul ...
在Java中执行JavaScript代码有几种方式,我将为你介绍其中的三种常见方式:使用Java的内置脚本引擎、使用第三方库GraalVMP ...