弹簧启动时的石英cron-trigger配置

时间:2016-07-02 07:01:33

标签: java spring postgresql spring-mvc cron

我在启动应用程序上配置了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

0 个答案:

没有答案
相关问题