mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-11 16:05:44 +01:00
The new scheduler is based on the cron-utils package and uses the same cron syntax as quartz. CronScheduler was mainly introduced, because of a ClassLoader leak with the old Quartz implementation. The leak comes from shiros use of InheriatableThreadLocal in combination with the WorkerThreads of Quartz. CronScheduler uses a ThreadFactory which clears the Shiro context before a new Thread is created (see CronThreadFactory).
60 lines
1.7 KiB
Java
60 lines
1.7 KiB
Java
package sonia.scm.schedule;
|
|
|
|
import com.cronutils.model.Cron;
|
|
import com.cronutils.model.CronType;
|
|
import com.cronutils.model.definition.CronDefinition;
|
|
import com.cronutils.model.definition.CronDefinitionBuilder;
|
|
import com.cronutils.model.time.ExecutionTime;
|
|
import com.cronutils.parser.CronParser;
|
|
|
|
import java.time.Clock;
|
|
import java.time.Duration;
|
|
import java.time.ZonedDateTime;
|
|
import java.util.Optional;
|
|
|
|
final class CronExpression {
|
|
|
|
private final Clock clock;
|
|
private final String expression;
|
|
private final ExecutionTime executionTime;
|
|
|
|
CronExpression(String expression) {
|
|
this(Clock.systemUTC(), expression);
|
|
}
|
|
|
|
CronExpression(Clock clock, String expression) {
|
|
this.clock = clock;
|
|
this.expression = expression;
|
|
executionTime = createExecutionTime(expression);
|
|
}
|
|
|
|
boolean shouldRun(ZonedDateTime time) {
|
|
ZonedDateTime now = ZonedDateTime.now(clock);
|
|
return time.isBefore(now);
|
|
}
|
|
|
|
Optional<ZonedDateTime> calculateNextRun() {
|
|
ZonedDateTime now = ZonedDateTime.now(clock);
|
|
Optional<ZonedDateTime> nextExecution = executionTime.nextExecution(now);
|
|
if (nextExecution.isPresent()) {
|
|
ZonedDateTime next = nextExecution.get();
|
|
if (Duration.between(now, next).toMillis() < 1000) {
|
|
return executionTime.nextExecution(now.plusSeconds(1L));
|
|
}
|
|
}
|
|
return nextExecution;
|
|
}
|
|
|
|
private ExecutionTime createExecutionTime(String expression) {
|
|
CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
|
|
CronParser parser = new CronParser(cronDefinition);
|
|
Cron cron = parser.parse(expression);
|
|
return ExecutionTime.forCron(cron);
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return expression;
|
|
}
|
|
}
|