mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-12 08:25:44 +01:00
replace QuartzScheduler with a more lightweight scheduler
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).
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user