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

prerna.reactor.scheduler.SchedulerFactorySingleton Maven / Gradle / Ivy

The newest version!
package prerna.reactor.scheduler;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.impl.StdSchedulerFactory;

import prerna.cluster.util.ClusterUtil;
import prerna.engine.impl.rdbms.H2EmbeddedServerEngine;
import prerna.engine.impl.rdbms.RDBMSNativeEngine;
import prerna.util.Constants;
import prerna.util.DIHelper;
import prerna.util.Utility;
import prerna.util.sql.AbstractSqlQueryUtil;
import prerna.util.sql.RdbmsTypeEnum;

public class SchedulerFactorySingleton {

	private static final Logger logger = LogManager.getLogger(SchedulerFactorySingleton.class);

	private static final String QUARTZ_CONFIGURATION_FILE = "quartz.properties";

	private static StdSchedulerFactory factory;

	public static final String DIR_SEPARATOR = java.nio.file.FileSystems.getDefault().getSeparator();

	static SchedulerFactorySingleton singleton = null;
	static Scheduler scheduler = null;
	int count = 0;

	private SchedulerFactorySingleton() {
	}

	public static SchedulerFactorySingleton getInstance() {
		if (singleton == null) {
			singleton = new SchedulerFactorySingleton();
			singleton.init();
		}
		return singleton;
	}
	
	public static boolean isInit() {
		return singleton != null;
	}

	private void init() {
		Properties quartzProperties = null;
		RDBMSNativeEngine schedulerDb = (RDBMSNativeEngine) Utility.getDatabase(Constants.SCHEDULER_DB);
		AbstractSqlQueryUtil queryUtil = schedulerDb.getQueryUtil();
		String username = queryUtil.getUsername();
		String password = queryUtil.getPassword();
		RdbmsTypeEnum rdbmsType = queryUtil.getDbType();
		factory = new StdSchedulerFactory();

		if (schedulerDb instanceof H2EmbeddedServerEngine) {
			quartzProperties = setUpQuartzProperties(((H2EmbeddedServerEngine) schedulerDb).getServerUrl(), 
					username, password, rdbmsType);
		} else { // instanceof RDBMSNativeEngine
			quartzProperties = setUpQuartzProperties(schedulerDb.getConnectionUrl(),
					username, password, rdbmsType);
		}

		try {
			factory.initialize(quartzProperties);
		} catch (SchedulerException se) {
			logger.error(Constants.STACKTRACE, se);
		}
	}

	public static Properties setUpQuartzProperties(String serverUrl, String username, String password, RdbmsTypeEnum rdbmsType) {
		Properties quartzProperties = new Properties();
		try (InputStream input = new FileInputStream(DIHelper.getInstance().getProperty(Constants.BASE_FOLDER)
				+ DIR_SEPARATOR + QUARTZ_CONFIGURATION_FILE)) {
			quartzProperties.load(input);
			quartzProperties.setProperty("org.quartz.dataSource.myDS.URL", serverUrl);
			quartzProperties.setProperty("org.quartz.dataSource.myDS.driver", rdbmsType.getDriver());
			quartzProperties.setProperty("org.quartz.dataSource.myDS.user", username);
			quartzProperties.setProperty("org.quartz.dataSource.myDS.password", password);
			quartzProperties.setProperty("org.quartz.jobStore.driverDelegateClass", SchedulerDatabaseUtility.getQuartzDelegateForRdbms(rdbmsType));
			if(ClusterUtil.IS_CLUSTERED_SCHEDULER) {
				quartzProperties.setProperty("org.quartz.scheduler.instanceId", "AUTO");
				quartzProperties.setProperty("org.quartz.jobStore.isClustered", "true");
			}
		} catch (IOException ex) {
			logger.error("Error with loading properties in config file " + ex.getMessage());
		}

		return quartzProperties;
	}

	public Scheduler getScheduler() {
		if(scheduler != null) {
			return scheduler;
		}
		
		try {
			scheduler = factory.getScheduler();
		} catch (SchedulerException se) {
			logger.error(Constants.STACKTRACE, se);
		}

		if (scheduler == null) {
			throw new NullPointerException("Scheduler is null as factory failed to retrieve scheduler");
		}

		return scheduler;
	}

	public void shutdownScheduler(boolean waitForJobsToComplete) {
		if(!ClusterUtil.IS_CLUSTERED_SCHEDULER) {
		try {
			if (scheduler != null && scheduler.isStarted()) {
				scheduler.shutdown(waitForJobsToComplete); 
			}
		} catch (SchedulerException se) {
			logger.error(Constants.STACKTRACE, se);
		}
	}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy