我在启动应用程序上配置了spring quartz。应用程序构建并没有任何错误。 现在我想将新的cron-triggers保存到我的postgresql数据库中,因为我已经在我的控制器上自动安装了 @Autowired私有SchedulerFactoryBean quartzScheduler; 。但春天的表现无法自动发生异常。
@Configuration
@ConditionalOnProperty(name = "quartz.enabled")
public class SchedulerConfig {
@Value("${db.driver}")
private String DB_DRIVER;
@Value("${db.password}")
private String DB_PASSWORD;
@Value("${db.url}")
private String DB_URL;
@Value("${db.username}")
private String DB_USERNAME;
//Configuration automatically inject objects from the spring context
@Bean
public JobFactory jobFactory(ApplicationContext applicationContext) {
AutowiringSpringBeanJobFactory autowiringSpringBeanJobFactory = new AutowiringSpringBeanJobFactory();
autowiringSpringBeanJobFactory.setApplicationContext(applicationContext);
return autowiringSpringBeanJobFactory;
}
//For execution based on scheduling parameters and executable work
@Bean
public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource, JobFactory jobFactory,
@Qualifier("customJobTrigger") Trigger customJobTrigger) throws IOException {
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
// this allows to update triggers in DB when updating settings in config file:
factoryBean.setOverwriteExistingJobs(true);
factoryBean.setDataSource(dataSource);
factoryBean.setJobFactory(jobFactory);
factoryBean.setQuartzProperties(quartzProperties());
factoryBean.setTriggers(customJobTrigger);
return factoryBean;
}
//The introduction of regular tasks profile
@Bean
public Properties quartzProperties() throws IOException {
PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));
propertiesFactoryBean.afterPropertiesSet();
return propertiesFactoryBean.getObject();
}
//Injection scheduled task Detail
@Bean
public JobDetailFactoryBean sampleJobDetail() {
return createJobDetail(CycleHoldingJob.class);
}
//Create abstract methods JobDetail
private static JobDetailFactoryBean createJobDetail(Class jobClass) {
JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
factoryBean.setJobClass(jobClass);
//job has to be durable to be stored in DB
factoryBean.setDurability(true);
return factoryBean;
}
//Injection scheduling parameters
@Bean(name = "sampleJobTrigger")
public SimpleTriggerFactoryBean sampleJobTrigger(@Qualifier("sampleJobDetail") JobDetail jobDetail,
@Value("${samplejob.frequency}") long frequency) {
return createTrigger(jobDetail, frequency);
}
@Bean(name = "customJobTrigger")
public CronTriggerFactoryBean cronTriggerFactoryBean(@Qualifier("sampleJobDetail") JobDetail jobDetail) {
CronTriggerFactoryBean ctFactory = new CronTriggerFactoryBean();
ctFactory.setJobDetail(jobDetail);
ctFactory.setName("sampleJobRunner");
ctFactory.setGroup("sampleGroup");
ctFactory.setStartDelay(0l);
ctFactory.setCronExpression("0/10 * * * * ?");
return ctFactory;
}
//Create a single abstract method of scheduling parameters
private static SimpleTriggerFactoryBean createTrigger(JobDetail jobDetail, long pollFrequencyMs) {
SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
factoryBean.setJobDetail(jobDetail);
factoryBean.setStartDelay(0l);
factoryBean.setRepeatInterval(pollFrequencyMs);
// in case of misfire, ignore all missed triggers and continue
factoryBean.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT);
return factoryBean;
}
//dataSource configuration class mortgage database
@Bean
public DataSource getDataSource() throws SQLException {
DataSource dataSource = new DataSource();
dataSource.setDriverClassName(DB_DRIVER);
dataSource.setUrl(DB_URL);
dataSource.setUsername(DB_USERNAME);
dataSource.setPassword(DB_PASSWORD);
return dataSource;
}
}
public class CycleHoldingJob extends QuartzJobBean{
private Log log = LogFactory.getLog(this.getClass());
private String batchProcessorName;
private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MMM/yyyy HH:mm:ss");
// private SendNotificationService sendNotificationService;
@Override
protected void executeInternal(JobExecutionContext jobCtx) throws JobExecutionException {
SchedulerContext schedCtx;
try {
schedCtx = jobCtx.getScheduler().getContext();
ApplicationContext appCtx = (ApplicationContext) schedCtx.get("applicationContext");
schedCtx.get("applicationContext");
log.info(" ==> Notification - " + jobCtx.getTrigger().getName() + " ");
// Retrieve the last date when the job was run
String type = jobCtx.getTrigger().getName();
Date lastDateRun = jobCtx.getPreviousFireTime();
if (lastDateRun != null) {
log.info(" ==> Last date run: " + sdf.format(lastDateRun));
}
// Do the actual work
// sendNotificationService = (SendNotificationService) appCtx.getBean(batchProcessorName);
// sendNotificationService.sendNotification(type);
log.info(" ==> nofiication - "
+ jobCtx.getTrigger().getName() + " ");
// Retrieve the next date when the job will be run
String nextDateRun = sdf.format(jobCtx.getNextFireTime());
log.info(" ==> Next date run: " + nextDateRun);
} catch (SchedulerException ex) {
log.error(" ==> Unable to complete execution of - "
+ jobCtx.getTrigger().getName(), ex);
log.info(" ==> This error occured date : " + sdf.format(new Date()));
// Thread.currentThread().interrupt();
throw new JobExecutionException("Unable to execute batch job: " + batchProcessorName, ex);
}
}
public String getBatchProcessorName() {
return batchProcessorName;
}
public void setBatchProcessorName(String batchProcessorName) {
this.batchProcessorName = batchProcessorName;
}
}
异常
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webServiceContoller': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.scheduling.quartz.SchedulerFactoryBean com.cycleforgreen.java.webService.WebServiceContoller.quartzScheduler; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.scheduling.quartz.SchedulerFactoryBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1210)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
at com.cycleforgreen.java.main.AppInitiation.main(AppInitiation.java:35)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.scheduling.quartz.SchedulerFactoryBean com.cycleforgreen.java.webService.WebServiceContoller.quartzScheduler; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.scheduling.quartz.SchedulerFactoryBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:561)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331)
... 16 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.scheduling.quartz.SchedulerFactoryBean] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1301)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:533)
... 18 more