package bo.gotthardt.schedule.quartz; import com.google.common.base.Preconditions; import io.dropwizard.db.DataSourceFactory; import io.dropwizard.lifecycle.Managed; import org.glassfish.hk2.api.ServiceLocator; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; import org.quartz.simpl.RAMJobStore; import javax.inject.Inject; import javax.inject.Provider; import java.util.Properties; public class Quartz implements Managed, Provider<Scheduler> { private final QuartzConfiguration quartzConfig; private final DataSourceFactory dbConfig; private Scheduler scheduler; @Inject public Quartz(QuartzConfiguration quartzConfig, DataSourceFactory dbConfig, ServiceLocator locator) throws SchedulerException { this.quartzConfig = quartzConfig; this.dbConfig = dbConfig; SchedulerFactory schedulerFactory = new StdSchedulerFactory(getProperties()); scheduler = schedulerFactory.getScheduler(); scheduler.setJobFactory(new HK2JobFactory(locator)); scheduler.start(); } @Override public void start() throws Exception { // Empty on purpose. } @Override public void stop() throws Exception { if (scheduler != null && scheduler.isStarted()) { scheduler.shutdown(); } } public Scheduler getScheduler() { Preconditions.checkNotNull(scheduler, "Scheduler not created yet."); return scheduler; } @Override public Scheduler get() { return getScheduler(); } private Properties getProperties() { Properties props = new Properties(); props.setProperty("org.quartz.jobStore.class", quartzConfig.getJobStore().getName()); props.setProperty("org.quartz.threadPool.threadCount", String.valueOf(quartzConfig.getThreads())); if (!quartzConfig.getJobStore().equals(RAMJobStore.class)) { props.setProperty("org.quartz.jobStore.driverDelegateClass", quartzConfig.getDbDelegate().getName()); props.setProperty("org.quartz.jobStore.dataSource", "main"); props.setProperty("org.quartz.dataSource.main.driver", dbConfig.getDriverClass()); props.setProperty("org.quartz.dataSource.main.URL", dbConfig.getUrl()); props.setProperty("org.quartz.dataSource.main.user", dbConfig.getUser()); props.setProperty("org.quartz.dataSource.main.password", dbConfig.getPassword()); } return props; } }