Verificación de expresión cron, análisis y obtención del próximo tiempo de ejecución

Tabla de contenido

I. Introducción

Dos, introduce la dependencia de maven

Tres, código fuente

Cuatro, prueba


I. Introducción

Una tarea programada es una tarea que ejecuta el trabajo planeado en el tiempo acordado, este es el significado superficial. En Linux, a menudo usamos el servidor cron para completar este trabajo. El servidor cron puede realizar tareas específicas según el tiempo acordado en el archivo de configuración.

Durante el desarrollo, es necesario verificar la validez de las expresiones cron y obtener el tiempo de ejecución. Estas funciones se implementan en CronUtil.

Dos, introduce la dependencia de maven

<dependency>
            <groupId>com.cronutils</groupId>
            <artifactId>cron-utils</artifactId>
            <version>9.1.3</version>
        </dependency>

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

Tres, código fuente

package com.asyf.demo.other_api.cron.cronutils;

import com.cronutils.descriptor.CronDescriptor;
import com.cronutils.model.Cron;
import com.cronutils.model.definition.CronDefinition;
import com.cronutils.model.definition.CronDefinitionBuilder;
import com.cronutils.parser.CronParser;
import org.quartz.TriggerUtils;
import org.quartz.impl.triggers.CronTriggerImpl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import static com.cronutils.model.CronType.QUARTZ;

public class CronUtil {

    public static void main(String[] args) throws ParseException {
        String expressiion = "0 0 0 ? 5 2#1";
        //expressiion = "0 0 0 0 5 2#1";

        //格式校验
        boolean b = checkValid(expressiion);
        System.out.println(b);

        if (b) {
            //解释cron表达式
            String s = describeCron(expressiion);
            System.out.println(s);

            //获取下次运行时间
            List<Date> nextExecTime = getNextExecTime(expressiion, 5);
            nextExecTime.stream().forEach(d -> {
                System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d));
            });
        }
    }

    /**
     * 解释cron表达式
     */
    public static String describeCron(String expressiion) {
        CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(QUARTZ);
        CronParser parser = new CronParser(cronDefinition);
        Cron cron = parser.parse(expressiion);
        //设置语言
        CronDescriptor descriptor = CronDescriptor.instance(Locale.CHINESE);
        return descriptor.describe(cron);
    }

    /**
     * 检查cron表达式的合法性
     *
     * @param cron cron exp
     * @return true if valid
     */
    public static boolean checkValid(String cron) {
        try {
            CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(QUARTZ);
            CronParser parser = new CronParser(cronDefinition);
            parser.parse(cron);
        } catch (IllegalArgumentException e) {
            System.out.println(String.format("cron=%s not valid", cron));
            return false;
        }
        return true;
    }

    /**
     * @param cronExpression cron表达式
     * @param numTimes       下一(几)次运行的时间
     * @return
     */
    public static List<Date> getNextExecTime(String cronExpression, Integer numTimes) throws ParseException {
        List<String> list = new ArrayList<>();
        CronTriggerImpl cronTriggerImpl = new CronTriggerImpl();
        cronTriggerImpl.setCronExpression(cronExpression);
        // 这个是重点,一行代码搞定
        return TriggerUtils.computeFireTimes(cronTriggerImpl, null, numTimes);
    }
    
}

Cuatro, prueba

true
在 00:00 在 五月 月 星期一 1 每个月
2021-05-03 00:00:00
2022-05-02 00:00:00
2023-05-01 00:00:00
2024-05-06 00:00:00
2025-05-05 00:00:00

 

Supongo que te gusta

Origin blog.csdn.net/cs373616511/article/details/115017562
Recomendado
Clasificación