@Override public void afterPropertiesSet() throws SchedulerException { if (this.scheduler == null) { this.scheduler = (this.schedulerName != null ? findScheduler(this.schedulerName) : findDefaultScheduler()); } registerListeners(); registerJobsAndTriggers(); }
@Override public void afterPropertiesSet() throws SchedulerConfigException { initialize(); }
@Override public void destroy() { shutdown(this.waitForJobsToCompleteOnShutdown); }
@Test public void schedulerWithSpringBeanJobFactoryAndJobSchedulingData() throws Exception { Assume.group(TestGroup.PERFORMANCE); DummyJob.param = 0; DummyJob.count = 0; SchedulerFactoryBean bean = new SchedulerFactoryBean(); bean.setJobFactory(new SpringBeanJobFactory()); bean.setJobSchedulingDataLocation("org/springframework/scheduling/quartz/job-scheduling-data.xml"); bean.afterPropertiesSet(); bean.start(); Thread.sleep(500); assertEquals(10, DummyJob.param); assertTrue("DummyJob should have been executed at least once.", DummyJob.count > 0); bean.destroy(); }
@Test public void createWithoutJobDetail() throws ParseException { CronTriggerFactoryBean factory = new CronTriggerFactoryBean(); factory.setName("myTrigger"); factory.setCronExpression("0 15 10 ? * *"); factory.afterPropertiesSet(); CronTrigger trigger = factory.getObject(); assertEquals("0 15 10 ? * *", trigger.getCronExpression()); }
@Test public void createWithoutJobDetail() throws ParseException { SimpleTriggerFactoryBean factory = new SimpleTriggerFactoryBean(); factory.setName("myTrigger"); factory.setRepeatCount(5); factory.setRepeatInterval(1000L); factory.afterPropertiesSet(); SimpleTrigger trigger = factory.getObject(); assertEquals(5, trigger.getRepeatCount()); assertEquals(1000L, trigger.getRepeatInterval()); }
@Override public Job newJob(TriggerFiredBundle bundle, Scheduler scheduler) throws SchedulerException { try { Object jobObject = createJobInstance(bundle); return adaptJob(jobObject); } catch (Throwable ex) { throw new SchedulerException("Job instantiation failed", ex); } }
@Override public void execute(Runnable task, long startTimeout) { execute(task); }
@SuppressWarnings("unchecked") public <T> Class<? extends T> loadClass(String name, Class<T> clazz) throws ClassNotFoundException { return (Class<? extends T>) loadClass(name); }
@Override public void start() throws SchedulingException { if (this.scheduler != null) { try { startScheduler(this.scheduler, this.startupDelay); } catch (SchedulerException ex) { throw new SchedulingException("Could not start Quartz Scheduler", ex); } } }
@Override public void initialize() throws SchedulerConfigException { // Absolutely needs thread-bound Executor to initialize. this.taskExecutor = SchedulerFactoryBean.getConfigTimeTaskExecutor(); if (this.taskExecutor == null) { throw new SchedulerConfigException("No local Executor found for configuration - " + "'taskExecutor' property must be set on SchedulerFactoryBean"); } }
@Override public void initialize() { if (this.resourceLoader == null) { this.resourceLoader = SchedulerFactoryBean.getConfigTimeResourceLoader(); if (this.resourceLoader == null) { this.resourceLoader = new DefaultResourceLoader(); } } }
/** * Register objects in the JobDataMap via a given Map. * <p>These objects will be available to this Job only, * in contrast to objects in the SchedulerContext. * <p>Note: When using persistent Jobs whose JobDetail will be kept in the * database, do not put Spring-managed beans or an ApplicationContext * reference into the JobDataMap but rather into the SchedulerContext. * @param jobDataAsMap a Map with String keys and any objects as values * (for example Spring-managed beans) * @see org.springframework.scheduling.quartz.SchedulerFactoryBean#setSchedulerContextAsMap */ public void setJobDataAsMap(Map<String, ?> jobDataAsMap) { getJobDataMap().putAll(jobDataAsMap); }
@Override public void execute(Runnable task) { Assert.notNull(task, "Runnable must not be null"); if (!runInThread(task)) { throw new SchedulingException("Quartz SimpleThreadPool already shut down"); } }
/** * Add the given job to the Scheduler, if it doesn't already exist. * Overwrites the job in any case if "overwriteExistingJobs" is set. * @param jobDetail the job to add * @return {@code true} if the job was actually added, * {@code false} if it already existed before * @see #setOverwriteExistingJobs */ private boolean addJobToScheduler(JobDetail jobDetail) throws SchedulerException { if (this.overwriteExistingJobs || getScheduler().getJobDetail(jobDetail.getKey()) == null) { getScheduler().addJob(jobDetail, true); return true; } else { return false; } }
@Test public void schedulerAccessorBean() throws Exception { Assume.group(TestGroup.PERFORMANCE); ClassPathXmlApplicationContext ctx = context("schedulerAccessorBean.xml"); Thread.sleep(3000); try { QuartzTestBean exportService = (QuartzTestBean) ctx.getBean("exportService"); QuartzTestBean importService = (QuartzTestBean) ctx.getBean("importService"); assertEquals("doImport called exportService", 0, exportService.getImportCount()); assertEquals("doExport not called on exportService", 2, exportService.getExportCount()); assertEquals("doImport not called on importService", 2, importService.getImportCount()); assertEquals("doExport called on importService", 0, importService.getExportCount()); } finally { ctx.close(); } }
@Override public Future<?> submit(Runnable task) { FutureTask<Object> future = new FutureTask<>(task, null); execute(future); return future; }
@Override public <T> Future<T> submit(Callable<T> task) { FutureTask<T> future = new FutureTask<>(task); execute(future); return future; }
@Override public <T> ListenableFuture<T> submitListenable(Callable<T> task) { ListenableFutureTask<T> future = new ListenableFutureTask<>(task); execute(future); return future; }
@Override public ListenableFuture<?> submitListenable(Runnable task) { ListenableFutureTask<Object> future = new ListenableFutureTask<>(task, null); execute(future); return future; }