-
-
Save jelies/5085593 to your computer and use it in GitHub Desktop.
| 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; | |
| } | |
| } |
Hello team I am getting bellow error when updating Java 17 -
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [java.util.regex.Pattern]: Factory method 'skipPattern' threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'quartzEndpoint' defined in class path resource [org/springframework/boot/actuate/autoconfigure/quartz/QuartzEndpointAutoConfiguration.class]: Unsatisfied dependency expressed through method 'quartzEndpoint' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'scheduler' defined in class path resource [com/blackberry/mtd/compliance/output/scheduling/impl/SchedulingConfiguration.class]: Unsatisfied dependency expressed through method 'scheduler' parameter 4; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'applicationTaskExecutor' defined in class path resource [org/springframework/boot/autoconfigure/task/TaskExecutionAutoConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor: Common causes of this problem include using a final class or a non-visible class; nested exception is org.springframework.cglib.core.CodeGenerationException: java.lang.LinkageError-->loader 'app' attempted duplicate class definition for org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor$$EnhancerBySpringCGLIB$$fb3f90ed. (org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor$$EnhancerBySpringCGLIB$$fb3f90ed is in unnamed module of loader 'app')
Are you sure @transactional works? I notice that at least Spring Aspect based logic doesn't work on such classes