All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 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