package edu.unc.lib.dl.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import net.greghaines.jesque.Job; import net.greghaines.jesque.worker.JobFactory; public class SpringJobFactory implements JobFactory, ApplicationContextAware { private Logger log = LoggerFactory.getLogger(SpringJobFactory.class); private ApplicationContext applicationContext; public SpringJobFactory() { } @Override public Object materializeJob(Job job) throws ClassNotFoundException { log.debug("looking for job in Spring context: {}", job.getClassName()); Object runnableJob = null; if (applicationContext.containsBeanDefinition(job.getClassName())) { runnableJob = applicationContext.getBean( job.getClassName(), job.getArgs()); } else { @SuppressWarnings("rawtypes") Class clazz = Class.forName(job.getClassName());// Lookup by Class String[] beanNames = applicationContext.getBeanNamesForType(clazz, true, false); if (applicationContext.containsBeanDefinition(job.getClassName())) { runnableJob = applicationContext.getBean( beanNames[0], job.getArgs()); } else { if (beanNames != null && beanNames.length == 1) { runnableJob = applicationContext.getBean( beanNames[0], job.getArgs()); } } } if(runnableJob == null) { throw new ClassNotFoundException("Neither bean ID nor class definition found for " + job.getClassName()); } else { return runnableJob; } } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }