获得不满意的依赖表示在quartz + Spring调度程序上的异常

时间:2016-06-20 21:26:04

标签: spring spring-boot quartz-scheduler spring-4

我试图在运行时通过在Spring boot中使用@Configuration和@Bean注释来创建bean。使用这种方法的原因是我将从数据库中获取任务列表scheduler为每个任务创建一个作业。但由于某些原因,我在

时遇到异常

例外:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'cronTriggerFactoryBean' defined in class path resource [com/hello/QuartzConfiguration.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [java.lang.String]: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:464) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:753) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538) ~[spring-context-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.5.RELEASE.jar:1.3.5.RELEASE]
    at com.hello.MainClass.main(MainClass.java:14) [classes/:na]
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE]
    ... 19 common frames omitted

代码

@Configuration
    @ComponentScan("com.hello") 
    public class QuartzConfiguration {


        @Autowired
        private ApplicationContext applicationContext;

        @Bean
        public SpringBeanJobFactory springBeanJobFactory() {
            AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();

            jobFactory.setApplicationContext(applicationContext);
            return jobFactory;
        }


        @Bean
        public JobDetailFactoryBean jobDetailFactoryBean(){
            JobDetailFactoryBean factory = new JobDetailFactoryBean();
            factory.setJobClass(SampleJob.class);
            Map<String,Object> map = new HashMap<String,Object>();
            map.put("name", "RAM");
            map.put(MyJobTwo.COUNT, 1);
            factory.setJobDataAsMap(map);
            factory.setGroup("mygroup");
            factory.setName("myjob");
            return factory;
        }
        @Bean
        public CronTriggerFactoryBean cronTriggerFactoryBean(String triggerName, String myGroup){
            CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean();
            stFactory.setJobDetail(jobDetailFactoryBean().getObject());
            stFactory.setStartDelay(3000);
            stFactory.setName(triggerName);
            stFactory.setGroup(myGroup);

            stFactory.setCronExpression("0/10 * * * * ?"); //0/10 * * * * ?
            return stFactory;
        }


        @Bean
        public SchedulerFactoryBean schedulerFactoryBean() {
            SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
            scheduler.setJobFactory(springBeanJobFactory());
            scheduler.setTriggers(cronTriggerFactoryBean("triggerName","MyGroup").getObject());
            return scheduler;
        }
    }

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

问题是你不能这样做:

        @Bean
        public CronTriggerFactoryBean cronTriggerFactoryBean(String triggerName, String myGroup){
            CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean();
            stFactory.setJobDetail(jobDetailFactoryBean().getObject());
            stFactory.setStartDelay(3000);
            stFactory.setName(triggerName);
            stFactory.setGroup(myGroup);

            stFactory.setCronExpression("0/10 * * * * ?"); //0/10 * * * * ?
            return stFactory;
        }

如果你这样做,spring会尝试从应用程序上下文中自动装配triggerNamemyGroup,所以你只需删除@Bean注释,一切都应该没问题。

<强>更新

试试这个:

    @Bean
    public CronTriggerFactoryBean cronTriggerFactoryBean(){
        CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean();
        stFactory.setJobDetail(jobDetailFactoryBean().getObject());
        stFactory.setStartDelay(3000);
        stFactory.setName("triggerName");
        stFactory.setGroup("myGroup");

        stFactory.setCronExpression("0/10 * * * * ?"); //0/10 * * * * ?
        return stFactory;
    }

        @Bean
        public SchedulerFactoryBean schedulerFactoryBean() {
            SchedulerFactoryBean scheduler = new SchedulerFactoryBean();
            scheduler.setJobFactory(springBeanJobFactory());
            scheduler.setTriggers(cronTriggerFactoryBean().getObject());
            return scheduler;
        }