2016-06-13 131 views
0

我试图动态注册作业/触发器。该场景是我有数据库,它具有所有的作业配置,如工作开始时间。所以我试图通过运行时间注册这个工作。每当我运行注册工作,它给了我下面的异常在Quartz + Spring中动态创建作业

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'schedulerFactoryBean' defined in class path resource [com/hello/QuartzFactory.class]: Invocation of init method failed; nested exception is org.quartz.SchedulerException: Registration of jobs and triggers failed: null [See nested exception: java.lang.NullPointerException] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) ~[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.quartz.SchedulerException: Registration of jobs and triggers failed: null 
    at org.springframework.scheduling.quartz.SchedulerAccessor.registerJobsAndTriggers(SchedulerAccessor.java:254) ~[spring-context-support-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:512) ~[spring-context-support-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574) ~[spring-beans-4.2.6.RELEASE.jar:4.2.6.RELEASE] 
    ... 16 common frames omitted 

代码:QuartzFactory

@Configuration 
public class QuartzFactory { 

    @Autowired 
    private ApplicationContext applicationContext; 

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

     jobFactory.setApplicationContext(applicationContext); 
     return jobFactory; 
    } 

    @Autowired 
     private QuartzConfiguration quartzConfiguration; 

    @Bean 
     public SchedulerFactoryBean schedulerFactoryBean() { 

      quartzConfiguration.setExpression("0/10 * * * * ?"); 
      CronTriggerFactoryBean data = quartzConfiguration.cronTriggerFactoryBean(); 

      SchedulerFactoryBean scheduler = new SchedulerFactoryBean(); 
      scheduler.setJobFactory(springBeanJobFactory()); 
      scheduler.setTriggers(data.getObject()); 
      return scheduler; 
     } 
} 

QuartzConfiguration

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

    public String getExpression() { 
     return expression; 
    } 

    public void setExpression(String expression) { 
     this.expression = expression; 
    } 

    private String expression; 


    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; 
    } 

    public CronTriggerFactoryBean cronTriggerFactoryBean(){ 
     CronTriggerFactoryBean stFactory = new CronTriggerFactoryBean(); 
     stFactory.setJobDetail(jobDetailFactoryBean().getObject()); 
     stFactory.setStartDelay(3000); 
     stFactory.setName("mytrigger"); 
     stFactory.setGroup("mygroup"); 
     stFactory.setCronExpression(expression); //0/10 * * * * ? 
     return stFactory; 
    } 
+0

有没有更新?因为我在这里有同样的问题。 –

回答

0

你忘了打电话给两个方法的afterPropertiesSet()工厂。

设置属性后,使用factory.afterPropertiesSet()和stFactory.afterPropertiesSet()。您还需要为Trigger Factory设置一个名称。

当您调用getObject时,如果您不调用此方法,您将收到null。

OR

批注QuartzConfiguration这两种方法与@Bean自动调用该方法的afterPropertiesSet。