
Biblioteca Java para analizar, validar, migrar y describir expresiones cron con soporte para múltiples formatos (Unix, Quartz, Spring) y salida legible para humanos y específica de la configuración regional.
Definimos cron y los soportamos.
cron-utils es una librería Java para definir, analizar, validar, migrar cron y obtener descripciones legibles por humanos. El proyecto sigue la Convención de Versionado Semántico, proporciona metadatos OSGi y utiliza la licencia Apache 2.0.
Descarga
cron-utils está disponible en el repositorio Maven central.
<dependency>
<groupId>com.cronutils</groupId>
<artifactId>cron-utils</artifactId>
<version>9.2.1</version>
</dependency>
Para desarrolladores Android, cron-utils 7.0.0 asume Android 26+. Para versiones anteriores de Android, considere usar cron-utils 6.0.6. Si se usa ScheduleExpression de Java EE, esto debe proporcionarse como una dependencia en tiempo de ejecución.
Desarrollo actual
Actualmente estamos trabajando para actualizar la base de código hacia JDK 16, para asegurar que será totalmente compatible con JDK 17 cuando se lance.
Ahora estamos desarrollando una nueva generación de descriptores de cron usando traducción neuronal. Cualquier tipo de contribución es bienvenida: desde ayuda con la generación de conjuntos de datos hasta entrenamiento de modelos de aprendizaje automático y utilidades para cargarlos. Si está interesado, siga el issue #3.
Características
Ejemplos de uso
A continuación presentamos algunos ejemplos. Puede encontrar estos y otros en un repositorio de muestra que creamos para mostrar las librerías cron-utils.
Construir definiciones cron
// Define your own cron: arbitrary fields are allowed and last field can be optional
CronDefinition cronDefinition =
CronDefinitionBuilder.defineCron()
.withSeconds().and()
.withMinutes().and()
.withHours().and()
.withDayOfMonth()
.supportsHash().supportsL().supportsW().and()
.withMonth().and()
.withDayOfWeek()
.withIntMapping(7, 0) //we support non-standard non-zero-based numbers!
.supportsHash().supportsL().supportsW().and()
.withYear().optional().and()
.instance();
// or get a predefined instance
cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(QUARTZ);
Construir una expresión cron
// Create a cron expression. CronMigrator will ensure you remain cron provider agnostic
import static com.cronutils.model.field.expression.FieldExpressionFactory.*;
Cron cron = CronBuilder.cron(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ))
.withYear(always())
.withDoM(between(SpecialChar.L, 3))
.withMonth(always())
.withDoW(questionMark())
.withHour(always())
.withMinute(always())
.withSecond(on(0))
.instance();
// Obtain the string expression
String cronAsString = cron.asString(); // 0 * * L-3 * ? *
Analizar
// Create a parser based on provided definition
CronParser parser = new CronParser(cronDefinition);
Cron quartzCron = parser.parse("0 23 * ? * 1-5 *");
... ¡incluso expresiones multi-cron! ¿Qué tal comprimir múltiples cron en una sola línea? En lugar de escribir 0 0 9 * * ? *, 0 0 10 * * ? *, 0 30 11 * * ? * y 0 0 12 * * ? * podemos envolverlo en 0 0|0|30|0 9|10|11|12 * * ? *
Describir
// Create a descriptor for a specific Locale
CronDescriptor descriptor = CronDescriptor.instance(Locale.UK);
// Parse some expression and ask descriptor for description
String description = descriptor.describe(parser.parse("*/45 * * * * ?"));
// Description will be: "every 45 seconds"
description = descriptor.describe(quartzCron);
// Description will be: "every hour at minute 23 every day between Monday and Friday"
// which is the same description we get for the cron below:
descriptor.describe(parser.parse("0 23 * ? * MON-FRI *"));
Migrar
// Migration between cron libraries has never been so easy!
// Turn cron expressions into another format by using CronMapper:
CronMapper cronMapper = CronMapper.fromQuartzToCron4j();
Cron cron4jCron = cronMapper.map(quartzCron);
// and to get a String representation of it, we can use
cron4jCron.asString();//will return: 23 * * * 1-5
Validar
cron4jCron.validate()
Calcular tiempo desde/hasta la ejecución
// Get date for last execution
ZonedDateTime now = ZonedDateTime.now();
ExecutionTime executionTime = ExecutionTime.forCron(parser.parse("* * * * * ? *"));
ZonedDateTime lastExecution = executionTime.lastExecution(now);
// Get date for next execution
ZonedDateTime nextExecution = executionTime.nextExecution(now);
// Time from last execution
Duration timeFromLastExecution = executionTime.timeFromLastExecution(now);
// Time to next execution
Duration timeToNextExecution = executionTime.timeToNextExecution(now);
Mapear constantes entre librerías
// Map day of week value from Quartz to JodaTime
int jodatimeDayOfWeek =
ConstantsMapper.weekDayMapping(
ConstantsMapper.QUARTZ_WEEK_DAY,
ConstantsMapper.JODATIME_WEEK_DAY
);
Formato de fecha y hora para humanos!
Use htime - Formato de fecha y hora legible por humanos para Java. A pesar de que esta funcionalidad no está incluida en el mismo jar, es un proyecto de cron-utils que puede encontrar útil.
// You no longer need to remember "YYYY-MM-dd KK a" patterns.
DateTimeFormatter formatter =
HDateTimeFormatBuilder
.getInstance()
.forJodaTime()
.getFormatter(Locale.US)
.forPattern("June 9, 2011");
String formattedDateTime = formatter.print(lastExecution);
// formattedDateTime will be lastExecution in "dayOfWeek, Month day, Year" format
cron-utils CLI
Proporcionamos una interfaz CLI simple para usar cron-utils directamente desde la consola, ¡sin escribir un nuevo proyecto! La CLI es un proyecto satélite, disponible en cron-utils-cli
Usage: java -jar cron-utils.jar com.cronutils.cli.CronUtilsCLI --validate -f [CRON4J|QUARTZ|UNIX] -e '<cron expression>'
Example: java -jar cron-utils.jar com.cronutils.cli.CronUtilsCLI --validate -f UNIX -e '* 1 * * *'
Si desea un jar independiente sin requerir el 'cp', construya un uber jar con :
mvn assembly:assembly -DdescriptorId=jar-with-dependencies
Luego, lance cli-utils (construido en el directorio target) con :
java -jar cron-utils-<version>-jar-with-dependencies.jar com.cronutils.cli.CronUtilsCLI --validate -f [CRON4J|QUARTZ|UNIX] -e '<cron expression>'`
¡Contribuya y Soporte!
¡Las contribuciones son bienvenidas! Puede contribuir mediante
¡Visite nuestra página! Para estadísticas sobre el proyecto, puede visitar nuestro perfil de OpenHUB.
Otros proyectos cron-utils
Le invitamos a visitar y usar los siguientes proyectos cron-utils: