package org.openstack.atlas.jobs; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.quartz.*; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.quartz.QuartzJobBean; public class DelegatingJobBean extends QuartzJobBean implements StatefulJob { private static final String APPLICATION_CONTEXT_KEY = "applicationContext"; private static final String JOB_BEAN_NAME_KEY = "job.bean.name"; protected final Log LOG = LogFactory.getLog(DelegatingJobBean.class); @Override protected final void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException { SchedulerContext schedulerContext; try { schedulerContext = jobExecutionContext.getScheduler().getContext(); } catch (SchedulerException e) { throw new JobExecutionException("Failure accessing scheduler context", e); } ApplicationContext appContext = (ApplicationContext) schedulerContext.get(APPLICATION_CONTEXT_KEY); String jobBeanName = (String) jobExecutionContext.getJobDetail().getJobDataMap().get(JOB_BEAN_NAME_KEY); LOG.info("Starting job: " + jobBeanName); JobInterface jobBean = (JobInterface) appContext.getBean(jobBeanName); try { jobBean.init(jobExecutionContext); jobBean.execute(); } finally { jobBean.destroy(); } } }