Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Quartz (2.1.6) java config with spring (3.2.1). Using a SpringBeanJobFactory to automatically autowire quartz classes.
package com.jelies.spring3tomcat7.config.quartz;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
/**
* This JobFactory autowires automatically the created quartz bean with spring @Autowired dependencies.
*
* @author jelies (thanks to Brian Matthews: http://webcache.googleusercontent.com/search?q=cache:FH-N1i--sDgJ:blog.btmatthews.com/2011/09/24/inject-application-context-dependencies-in-quartz-job-beans/+&cd=7&hl=en&ct=clnk&gl=es)
*
*/
public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements
ApplicationContextAware {
private transient AutowireCapableBeanFactory beanFactory;
@Override
public void setApplicationContext(final ApplicationContext context) {
beanFactory = context.getAutowireCapableBeanFactory();
}
@Override
protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
final Object job = super.createJobInstance(bundle);
beanFactory.autowireBean(job);
return job;
}
}
package com.jelies.spring3tomcat7.service.proceso;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.jelies.spring3tomcat.model.entity.Example;
import com.jelies.spring3tomcat.repository.ExampleRepository;
import com.jelies.spring3tomcat.service.ExampleService;
@Service
@Transactional
public class ExampleService implements Job {
@Autowired
private ExampleRepository exampleRepository;
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
Example example = new Example();
example.setFoo("test");
exampleRepository.save(example);
}
}
package com.jelies.spring3tomcat7.config;
import java.io.IOException;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import org.quartz.Trigger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.PropertiesFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import com.jelies.spring3tomcat7.config.quartz.AutowiringSpringBeanJobFactory;
@Configuration
public class QuartzConfig {
private final Logger log = LoggerFactory.getLogger(this.getClass().getSimpleName());
@Autowired
private DataSource dataSource;
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void init() {
log.debug("QuartzConfig initialized.");
}
@Bean
public SchedulerFactoryBean quartzScheduler() {
SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();
quartzScheduler.setDataSource(dataSource);
quartzScheduler.setTransactionManager(transactionManager);
quartzScheduler.setOverwriteExistingJobs(true);
quartzScheduler.setSchedulerName("jelies-quartz-scheduler");
// custom job factory of spring with DI support for @Autowired!
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
quartzScheduler.setJobFactory(jobFactory);
quartzScheduler.setQuartzProperties(quartzProperties());
Trigger[] triggers = { procesoMQTrigger().getObject() };
quartzScheduler.setTriggers(triggers);
return quartzScheduler;
}
@Bean
public JobDetailFactoryBean procesoMQJob() {
JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
jobDetailFactory.setJobClass(ExampleService.class);
jobDetailFactory.setGroup("spring3-quartz");
return jobDetailFactory;
}
@Bean
public CronTriggerFactoryBean procesoMQTrigger() {
CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
cronTriggerFactoryBean.setJobDetail(procesoMQJob().getObject());
cronTriggerFactoryBean.setCronExpression(0 * * * * ?);
cronTriggerFactoryBean.setGroup("spring3-quartz");
return cronTriggerFactoryBean;
}
@Bean
public Properties quartzProperties() {
PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
Properties properties = null;
try {
propertiesFactoryBean.afterPropertiesSet();
properties = propertiesFactoryBean.getObject();
} catch (IOException e) {
log.warn("Cannot load quartz.properties.");
}
return properties;
}
}
@Greetzkenny
Copy link

Greetzkenny commented Oct 9, 2018

I came across a problem when trying your solution and I noticed that your ExampleService, who implements Job, has no public no-argument constructor. This is mandatory according to: http://www.quartz-scheduler.org/documentation/quartz-2.x/cookbook/DefineJobWithData.html

@thedevd
Copy link

thedevd commented Nov 22, 2018

Any one with full working example ?

@bkahlerventer
Copy link

bkahlerventer commented Aug 11, 2019

@edin-m
Copy link

edin-m commented Dec 17, 2019

Does anybody have something like this for Spring Boot 2.x and Spring 5.2?

It doesn't work for me because for some reason, in Spring internally, two (of the same) types don't match so Spring can't autowire.

@apolischuk
Copy link

apolischuk commented Jan 21, 2021

Are you sure @transactional works? I notice that at least Spring Aspect based logic doesn't work on such classes

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment