
Biblioteca Java para analisar, validar, migrar e descrever expressões cron com suporte para múltiplos formatos (Unix, Quartz, Spring) e saída legível por humanos em diferentes localidades.
Definimos crons. E damos suporte a eles.
cron-utils é uma biblioteca Java para definir, analisar (parse), validar, migrar crons, bem como obter descrições legíveis por humanos para eles. O projeto segue a Convenção de Versionamento Semântico, fornece metadados OSGi e usa licença Apache 2.0.
Download
cron-utils está disponível no repositório Maven central.
<dependency>
<groupId>com.cronutils</groupId>
<artifactId>cron-utils</artifactId>
<version>9.2.1</version>
</dependency>
Para desenvolvedores Android, cron-utils 7.0.0 requer Android 26+. Para versões anteriores do Android, considere usar cron-utils 6.0.6. Se você usa ScheduleExpression do Java EE, ela deve ser fornecida como uma dependência de runtime.
Desenvolvimento atual
Atualmente, estamos trabalhando para atualizar a base de código para o JDK 16, garantindo que será totalmente compatível com o JDK 17 quando for lançado.
Agora estamos desenvolvendo uma nova geração de descritores de cron usando tradução neural! Qualquer tipo de contribuição é bem-vinda: desde ajuda com a geração de datasets até treinamento de modelos de machine learning e utilitários para carregá-los! Se tiver interesse, acompanhe a issue #3
Funcionalidades
Exemplos de Uso
Abaixo apresentamos alguns exemplos. Você pode encontrar estes e outros em um repositório de exemplos que criamos para demonstrar as bibliotecas cron-utils!
Construir definições de 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 uma expressão 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 * ? *
Parse
// Create a parser based on provided definition
CronParser parser = new CronParser(cronDefinition);
Cron quartzCron = parser.parse("0 23 * ? * 1-5 *");
... até mesmo expressões multi-cron! Que tal combinar vários crons em uma única linha? Em vez de escrever 0 0 9 * * ? *, 0 0 10 * * ? *, 0 30 11 * * ? * e 0 0 12 * * ? *, podemos agrupá-los em 0 0|0|30|0 9|10|11|12 * * ? *
Descrever
// 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 tempo desde/até a execução
// 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);