Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

spring 4 with quartz scheduler

configuration

@Configuration
@ComponentScan(basePackages="com.lokesh.tracker.integrations.jobs")
public class QuartzConfig {

    public JobDetailFactoryBean dailySummary(){
        JobDetailFactoryBean bean=new JobDetailFactoryBean();
        bean.setJobClass(DailySummary.class);
        bean.setName("dailySummary");
        bean.setGroup("dailySummaries");
        return bean;
    }


    public CronTriggerFactoryBean dailySummarytrigger(){
        CronTriggerFactoryBean bean=new CronTriggerFactoryBean();
        bean.setJobDetail(dailySummary().getObject());
        bean.setStartDelay(5000);
        bean.setBeanName("dailySummarytrigger");
        bean.setGroup("dailySummaries");
        bean.setCronExpression("0 0/1 * 1/1 * ? *");
        return bean;
    }

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

Job

@DisallowConcurrentExecution
public class DailySummary extends QuartzJobBean{

    @Override
    protected void executeInternal(JobExecutionContext arg0)
            throws JobExecutionException {
        System.out.println("hello");
    }

}

error

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'schedulerFactoryBean' defined in com.lokesh.tracker.config.QuartzConfig: 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:1574)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    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:736)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4992)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5492)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: org.quartz.SchedulerException: Registration of jobs and triggers failed: null [See nested exception: java.lang.NullPointerException]
    at org.springframework.scheduling.quartz.SchedulerAccessor.registerJobsAndTriggers(SchedulerAccessor.java:254)
    at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:512)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
    ... 21 more
Caused by: java.lang.NullPointerException
    at org.springframework.scheduling.quartz.SchedulerAccessor.addTriggerToScheduler(SchedulerAccessor.java:291)
    at org.springframework.scheduling.quartz.SchedulerAccessor.registerJobsAndTriggers(SchedulerAccessor.java:235)
    ... 24 more

Can some identify my errors. i am using Quartz for the first time. so i could not understand what it says in the error.In this example i want to execute daily summmary class with quartz.

like image 452
lch Avatar asked Nov 06 '15 16:11

lch


People also ask

What is Spring Quartz scheduler?

Quartz is an open source Java library for scheduling Jobs. It has a very rich set of features including but not limited to persistent Jobs, transactions, and clustering. You can schedule Jobs to be executed at a certain time of day, or periodically at a certain interval, and much more.

What is LocalDataSourceJobStore?

public class LocalDataSourceJobStore extends JobStoreCMT. Subclass of Quartz's JobStoreCMT class that delegates to a Spring-managed DataSource instead of using a Quartz-managed JDBC connection pool. This JobStore will be used if SchedulerFactoryBean's "dataSource" property is set.

How do you use a quartz scheduler?

These steps are as follows: In the first step, we have to initialize the scheduler instance from Quartz by using StdSchedulerFactory() method. After that, we start the scheduler instance with the Quartz API start() method. Start the scheduler instance with Quartz API start()


2 Answers

You should annotate your dailySummarytrigger , dailySummary with @Bean annotation. These are full Spring beans and there is a post processing that happens before these beans are fully realized. You are bypassing these by not annotating them with @Bean

like image 166
Biju Kunjummen Avatar answered Nov 03 '22 01:11

Biju Kunjummen


You should use the @Scheduled annotation from spring instead of this configuration.

Check out this documentations: http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#scheduling

All you need to do is to create a Scheduler bean and then annotate the method you like to run on a scheduled time with @Scheduled(cron="0 0/1 * 1/1 * ? *")

like image 34
renanleandrof Avatar answered Nov 03 '22 02:11

renanleandrof