
Bibliothèque Java pour l'analyse, la validation, la migration et la description d'expressions cron avec prise en charge de plusieurs formats (Unix, Quartz, Spring) et sortie lisible par l'homme et spécifique à la locale.
Nous définissons les crons. Et nous les supportons.
cron-utils est une bibliothèque Java pour définir, analyser, valider, migrer des crons ainsi que pour en obtenir des descriptions lisibles par les humains. Le projet suit la Convention de Versionnement Sémantique, fournit des métadonnées OSGi et utilise la licence Apache 2.0.
Téléchargement
cron-utils est disponible sur le dépôt Maven central.
<dependency>
<groupId>com.cronutils</groupId>
<artifactId>cron-utils</artifactId>
<version>9.2.1</version>
</dependency>
Pour les développeurs Android, cron-utils 7.0.0 suppose Android 26+. Pour les versions antérieures d'Android, envisagez d'utiliser cron-utils 6.0.6. Si vous utilisez ScheduleExpression de Java EE, cela doit être fourni comme une dépendance d'exécution.
Développement actuel
Nous travaillons actuellement à mettre à jour la base de code vers JDK 16, pour garantir une pleine compatibilité avec JDK 17 lors de sa sortie.
Nous développons actuellement une nouvelle génération de descripteurs de cron utilisant la traduction neuronale ! Toute contribution est la bienvenue : de l'aide à la génération de jeux de données à l'entraînement de modèles d'apprentissage automatique et aux utilitaires pour les charger ! Si vous êtes intéressé, veuillez suivre le problème #3
Fonctionnalités
Exemples d'utilisation
Ci-dessous nous présentons quelques exemples. Vous pouvez les trouver ainsi que d'autres dans un dépôt d'exemples que nous avons créé pour présenter les bibliothèques cron-utils !
Construire des définitions 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);
Construire une expression 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 * ? *
Analyser
// Create a parser based on provided definition
CronParser parser = new CronParser(cronDefinition);
Cron quartzCron = parser.parse("0 23 * ? * 1-5 *");
... même des expressions multi-cron ! Que diriez-vous de réduire plusieurs crons en une seule ligne ? Au lieu d'écrire 0 0 9 * * ? *, 0 0 10 * * ? *, 0 30 11 * * ? * et 0 0 12 * * ? * nous pouvons les encapsuler dans 0 0|0|30|0 9|10|11|12 * * ? *
Décrire
// 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 *"));
La description sera : « toutes les heures à la minute 23 chaque jour entre lundi et vendredi » qui est la même description que nous obtenons pour le cron ci-dessous :
descriptor.describe(parser.parse("0 23 * ? * MON-FRI *"));
Migrer
// 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
Valider
cron4jCron.validate()
Calculer le temps depuis/jusqu'à l'exécution
// 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);
Mapper les constantes entre bibliothèques
// Map day of week value from Quartz to JodaTime
int jodatimeDayOfWeek =
ConstantsMapper.weekDayMapping(
ConstantsMapper.QUARTZ_WEEK_DAY,
ConstantsMapper.JODATIME_WEEK_DAY
);
Formatage de la date et de l'heure pour les humains !
Utilisez htime - Formatage de date/heure lisible par les humains pour Java ! Bien que cette fonctionnalité ne soit pas incluse dans le même jar, c'est un projet cron-utils que vous pourriez trouver utile.
// 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
CLI cron-utils
Nous fournissons une interface CLI simple pour utiliser cron-utils directement depuis la console, sans écrire un nouveau projet ! La CLI est un projet satellite, disponible sur 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 vous voulez un jar autonome sans nécessiter le 'cp', construisez un uber jar avec :
mvn assembly:assembly -DdescriptorId=jar-with-dependencies
Ensuite, lancez cli-utils (construit dans le répertoire target) avec :
java -jar cron-utils-<version>-jar-with-dependencies.jar com.cronutils.cli.CronUtilsCLI --validate -f [CRON4J|QUARTZ|UNIX] -e '<cron expression>'`
Contribuez et soutenez !
Les contributions sont les bienvenues ! Vous pouvez contribuer en
Consultez notre page ! Pour des statistiques sur le projet, vous pouvez visiter notre profil OpenHUB.
Autres projets cron-utils
Vous êtes invités à visiter et utiliser les projets cron-utils suivants :