
com.clickntap.square.cron.Cron Maven / Gradle / Ivy
package com.clickntap.square.cron;
import java.time.Duration;
import java.time.ZonedDateTime;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
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;
public class Cron {
private ScheduledExecutorService scheduler;
private Map taskStatusMap;
private Map cronExecutionMap;
public Cron() throws Exception {
this.scheduler = Executors.newScheduledThreadPool(1);
this.taskStatusMap = new HashMap<>();
this.cronExecutionMap = new HashMap<>();
}
public void scheduleTask(String cronExpression, Class extends CronTask> taskClass) throws Exception {
CronDefinition cronDefinition = CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ);
CronParser parser = new CronParser(cronDefinition);
com.cronutils.model.Cron cron = parser.parse(cronExpression);
ExecutionTime executionTime = ExecutionTime.forCron(cron);
cronExecutionMap.put(cronExpression, executionTime);
AtomicBoolean isRunning = new AtomicBoolean(false);
taskStatusMap.put(cronExpression, isRunning);
scheduler.scheduleAtFixedRate(() -> {
ZonedDateTime nextExecutionTime = executionTime.nextExecution(ZonedDateTime.now()).orElse(ZonedDateTime.now());
long delayUntilNextExecution = Duration.between(ZonedDateTime.now(), nextExecutionTime).toMillis();
if (delayUntilNextExecution > 0 && isRunning.compareAndSet(false, true)) {
scheduler.schedule(() -> {
try {
CronTask task = taskClass.getDeclaredConstructor().newInstance();
task.execute();
} catch (Exception e) {
e.printStackTrace();
} finally {
isRunning.set(false);
}
}, delayUntilNextExecution, TimeUnit.MILLISECONDS);
}
}, 0, 1, TimeUnit.SECONDS);
}
public void startup() throws Exception {
}
public void reset() throws Exception {
taskStatusMap.values().forEach(status -> status.set(false));
}
public void shutdown() throws Exception {
if (scheduler != null && !scheduler.isShutdown()) {
scheduler.shutdown();
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy