Spring Quartz Scheduler

https://github.com/spring-boot-tutorials/spring-quartz-scheduler

In this article we will configure Spring Quartz Scheduler.

Create Initial Code Base

  • Go to https://start.spring.io/

  • Add the following dependencies:

    • spring-boot-starter-quartz

    • spring-boot-starter-web

    • lombok

  • Click Generate

Dependencies

Dependencies used in pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

Properties

Add the following properties in src/main/resources/application.properties:

spring.quartz.job-store-type=memory

Configuration

Let’s create a new file src/main/java/com/example/spring_quartz_scheduler/SampleConfiguration.java

@Configuration
public class SampleConfiguration {

    ////////////////
    // JOB DETAIL //
    ////////////////

//    /**
//     * Quartz Way
//     */
//    @Bean
//    public JobDetail jobDetail() {
//        return JobBuilder.newJob()
//                .ofType(SampleJob.class)
//                .storeDurably()
//                .withIdentity("Qrtz_Job_Detail")
//                .withDescription("Invoke Sample Job service...")
//                .build();
//    }

    /**
     * Spring Way
     */
    @Bean
    public JobDetailFactoryBean jobDetail() {
        JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
        jobDetailFactory.setJobClass(SampleJob.class);
        jobDetailFactory.setDescription("Invoke Sample Job service...");
        jobDetailFactory.setDurability(true);
        return jobDetailFactory;
    }


    /////////////
    // TRIGGER //
    /////////////

//    /**
//     * Quartz Way
//     */
//    @Bean
//    public Trigger trigger(JobDetail jobDetail) {
//        return TriggerBuilder.newTrigger().forJob(jobDetail)
//                .withIdentity("Qrtz_Trigger")
//                .withDescription("Sample trigger")
//                .withSchedule(simpleSchedule().repeatForever().withIntervalInSeconds(10))
//                .build();
//    }

    /**
     * Spring Way
     */
    @Bean
    public SimpleTriggerFactoryBean trigger(JobDetail job) {
        SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean();
        trigger.setJobDetail(job);
        trigger.setRepeatInterval(1000);
        trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
        return trigger;
    }


    ///////////////
    // SCHEDULER //
    ///////////////

//    /**
//     * Quartz Way
//     */
//    @Bean
//    public Scheduler scheduler(Trigger trigger, JobDetail jobDetail, SchedulerFactoryBean factory) throws SchedulerException {
//        Scheduler scheduler = factory.getScheduler();
//        scheduler.scheduleJob(jobDetail, trigger);
//        scheduler.start();
//        return scheduler;
//    }


//    /**
//     * Spring Way - autoconfigured by
//     * org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration
//     */
//    @Bean
//    public SchedulerFactoryBean scheduler(Trigger trigger, JobDetail jobDetail, DataSource quartzDataSource) {
//        SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
//        schedulerFactory.setConfigLocation(new ClassPathResource("quartz.properties"));
//
//        schedulerFactory.setJobFactory(springBeanJobFactory());
//        schedulerFactory.setJobDetails(jobDetail);
//        schedulerFactory.setTriggers(trigger);
//        schedulerFactory.setDataSource(quartzDataSource);
//        return schedulerFactory;
//    }
}

Sample Job

Create a new file src/main/java/com/example/spring_quartz_scheduler/SampleJob.java:

public class SampleJob implements Job {
    @Autowired
    private SampleJobService jobService;

    public SampleJob() {
        System.out.println("SampleJob created");
    }

    public void execute(JobExecutionContext context) throws JobExecutionException {
        this.jobService.doSomething();
    }
}

Sample Job Service

Create a new file src/main/java/com/example/spring_quartz_scheduler/SampleJobService.java:

@Service
public class SampleJobService {
    public void doSomething() {
        System.out.println("Hello, World!");
    }
}

Run & Verify Application

Open terminal at project root and execute the following:

mvn spring-boot:run