Quartz cron schedule Example
This is an example of how to create and run scheduled jobs using cron expressions and Quartz Scheduler, the open source, Java library for job scheduling. The Quartz Scheduler can create schedules for executing jobs in an application and may also include features like support for JTA transactions and clustering. It is used for system maintenance needs, or it can drive the workflow of a procedure.
Its basic components are the Job
, that represents a job to be scheduled, the Scheduler
of the job and the Trigger
, that defines the schedule upon which a given job will be executed.
Cron is a UNIX tool with well known scheduling capabilities. Cron expressions provide the ability to specify complex time combinations such as “At 8:00am every Monday through Friday”. In order to schedule a job using a cron expression, we can make use of the CronTrigger
class, which is used to fire a job at given moments in time, defined with Unix ‘cron-like’ schedule definitions. Below, we will create and fire some simple custom jobs, making use of a CronTrigger
and some cron expressions.
You may skip project creation and jump directly to the beginning of the example below.
Our preferred development environment is Eclipse. We are using Eclipse Juno (4.2) version, along with Maven Integration plugin version 3.1.0. You can download Eclipse from here and Maven Plugin for Eclipse from here. The installation of Maven plugin for Eclipse is out of the scope of this tutorial and will not be discussed. We are also using JDK 7_u_21.
Let’s begin,
1. Create a new Maven project
Go to File -> Project ->Maven -> Maven Project.
In the “Select project name and location” page of the wizard, make sure that “Create a simple project (skip archetype selection)” option is checked, hit “Next” to continue with default values.
In the “Enter an artifact id” page of the wizard, you can define the name and main package of your project. We will set the “Group Id” variable to "com.javacodegeeks.snippets.enterprise"
and the “Artifact Id” variable to "quartzexample"
. The aforementioned selections compose the main project package as "com.javacodegeeks.snippets.enterprise.quartzexample"
and the project name as "quartzexample"
. Hit “Finish” to exit the wizard and to create your project.
The Maven project structure is shown below:
- It consists of the following folders:
- /src/main/java folder, that contains source files for the dynamic content of the application,
- /src/test/java folder contains all source files for unit tests,
- /src/main/resources folder contains configurations files,
- /target folder contains the compiled and packaged deliverables,
- the pom.xml is the project object model (POM) file. The single file that contains all project related configuration.
2. Add quartz dependency
Add the quartz
dependency in Maven’s pom.xml
file, by editing it at the “Pom.xml” page of the POM editor, as shown below:
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.javacodegeeks.snippets.enterprise</groupId> <artifactId>quartzexample</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> </dependencies> </project>
As you can see Maven manages library dependencies declaratively. A local repository is created (by default under {user_home}/.m2 folder) and all required libraries are downloaded and placed there from public repositories. Furthermore intra – library dependencies are automatically resolved and manipulated.
3. Create the job
Every custom job shown below must implement the Job
interface. It overrides the execute(JobExecutionContext context)
method. When the Job
‘s trigger
fires, this method is invoked by one of the Scheduler
‘s worker threads. The JobExecutionContext
object that is passed to this method provides the job instance with a handle to the scheduler that executed it, a handle to the trigger that triggered the execution and the job’s JobDetail
object.
All jobs type a hello message with the time.
Job1.java
package com.javacodegeeks.snippets.enterprise.quartzexample.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job1 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Job1 --->>> Hello geeks! Time is " + new Date()); } }
Job2.java
package com.javacodegeeks.snippets.enterprise.quartzexample.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job2 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Job2 --->>> Hello geeks! Time is " + new Date()); } }
Job3.java
package com.javacodegeeks.snippets.enterprise.quartzexample.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job3 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Job3 --->>> Hello geeks! Time is " + new Date()); } }
Job4.java
package com.javacodegeeks.snippets.enterprise.quartzexample.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job4 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Job4 --->>> Hello geeks! Time is " + new Date()); } }
Job5.java
package com.javacodegeeks.snippets.enterprise.quartzexample.job; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class Job5 implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Job5 --->>> Hello geeks! Time is " + new Date()); } }
4. Create the Scheduler and the Trigger
MyApp.java
class will be used to execute all 5 jobs. For every job it has a JobDetail
object, which is used to create the job instance. The JobBuilder
instantiates the job:
newJob(Class<? extends Job> jobClass)
method sets the java class representing the job which is being built.withIdentity(String name)
method sets aJobKey
with the given name and default group to identify theJobDetail
.build()
method builds the job.
Every job also needs a trigger. The CronTrigger
class uses the TriggerBuilder.newTrigger()
to create the trigger
instance, and the withIdentity(String name, String group)
method to set a triggerKey
with the given name and a group to identify the Trigger
.
- The trigger of the
Job1.java
class uses thewithSchedule(CronScheduleBuilder.cronSchedule(String cronExpression))
method, which creates aCronScheduleBuilder
set to repeat every 5 seconds. - The trigger of the
Job2.java
class uses thewithSchedule(CronScheduleBuilder.cronSchedule(CronExpression cronExpression))
method, that creates aCronScheduleBuilder
with a newCronExpression
set to repeat every 7 seconds. - The trigger of the
Job3.java
class uses thewithSchedule(CronScheduleBuilder.dailyAtHourAndMinute(int hour, int minute))
method, that sets the schedule to fire every day at the given time (13:46). - The trigger of the
Job4.java
class uses thewithSchedule(CronScheduleBuilder.weeklyOnDayAndHourAndMinute(int dayOfWeek, int hour, int minute))
method, that sets the schedule to fire one per week on the given day at the given time (the third day, at 13:46). - The trigger of the
Job4.java
class uses thewithSchedule(CronScheduleBuilder.monthlyOnDayAndHourAndMinute(int dayOfMonth, int hour, int minute))
method, that sets the schedule to fire one per month on the given day of month at the given time (the 28th of the month at 13:46).
The build()
method is used to build each Trigger
.
Finally, a scheduler is also created for every job, using new StdSchedulerFactory().getScheduler()
. The scheduler starts the threads that fire the Trigger
with the start()
method and adds the given JobDetail
and associates the given Trigger
with it, using scheduleJob(JobDetail jobDetail, Trigger trigger)
.
MyApp.java
package com.javacodegeeks.snippets.enterprise.quartzexample; import org.quartz.CronExpression; import org.quartz.CronScheduleBuilder; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; import com.javacodegeeks.snippets.enterprise.quartzexample.job.Job1; import com.javacodegeeks.snippets.enterprise.quartzexample.job.Job2; import com.javacodegeeks.snippets.enterprise.quartzexample.job.Job3; import com.javacodegeeks.snippets.enterprise.quartzexample.job.Job4; import com.javacodegeeks.snippets.enterprise.quartzexample.job.Job5; public class MyApp { public static void main(String[] args) { try { JobDetail job1 = JobBuilder.newJob(Job1.class) .withIdentity("job1", "group1").build(); Trigger trigger1 = TriggerBuilder.newTrigger() .withIdentity("cronTrigger1", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); Scheduler scheduler1 = new StdSchedulerFactory().getScheduler(); scheduler1.start(); scheduler1.scheduleJob(job1, trigger1); JobDetail job2 = JobBuilder.newJob(Job2.class) .withIdentity("job2", "group2").build(); Trigger trigger2 = TriggerBuilder.newTrigger() .withIdentity("cronTrigger2", "group2") .withSchedule(CronScheduleBuilder.cronSchedule(new CronExpression("0/7 * * * * ?"))) .build(); Scheduler scheduler2 = new StdSchedulerFactory().getScheduler(); scheduler2.start(); scheduler2.scheduleJob(job2, trigger2); JobDetail job3 = JobBuilder.newJob(Job3.class) .withIdentity("job3", "group3").build(); Trigger trigger3 = TriggerBuilder.newTrigger() .withIdentity("cronTrigger3", "group3") .withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(13, 46)) .build(); Scheduler scheduler3 = new StdSchedulerFactory().getScheduler(); scheduler3.start(); scheduler3.scheduleJob(job3, trigger3); JobDetail job4 = JobBuilder.newJob(Job4.class) .withIdentity("job4", "group4").build(); Trigger trigger4 = TriggerBuilder.newTrigger() .withIdentity("cronTrigger4", "group4") .withSchedule(CronScheduleBuilder.weeklyOnDayAndHourAndMinute(3, 13, 46)) .build(); Scheduler scheduler4 = new StdSchedulerFactory().getScheduler(); scheduler4.start(); scheduler4.scheduleJob(job4, trigger4); JobDetail job5 = JobBuilder.newJob(Job5.class) .withIdentity("job5", "group5").build(); Trigger trigger5 = TriggerBuilder .newTrigger().withIdentity("cronTrigger5", "group5") .withSchedule(CronScheduleBuilder.monthlyOnDayAndHourAndMinute(28, 13, 46)) .build(); Scheduler scheduler5 = new StdSchedulerFactory().getScheduler(); scheduler5.start(); scheduler5.scheduleJob(job5, trigger5); Thread.sleep(100000); scheduler1.shutdown(); scheduler2.shutdown(); scheduler3.shutdown(); scheduler4.shutdown(); scheduler5.shutdown(); } catch (Exception e) { e.printStackTrace(); } } }
5. Run the application
If you run MyApp.java
class, the result will be something like the output below:
As you can see, the Job1.java
is executed every 5 seconds, Job2.java
every 7 seconds and the rest of the jobs are only executed at the specified time.
Note that job4
does not get executed, since it will be triggered on the third day of the week, which is Tuesday (Today it’s Wednesday!)
Output
Job1 --->>> Hello geeks! Time is Wed Jan 28 13:45:55 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:45:56 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:00 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:46:00 EET 2015 Job3 --->>> Hello geeks! Time is Wed Jan 28 13:46:00 EET 2015 Job5 --->>> Hello geeks! Time is Wed Jan 28 13:46:00 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:05 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:46:07 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:10 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:46:14 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:15 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:20 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:46:21 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:25 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:46:28 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:30 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:35 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:46:35 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:40 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:46:42 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:45 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:46:49 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:50 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:46:55 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:46:56 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:47:00 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:47:00 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:47:05 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:47:07 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:47:10 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:47:14 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:47:15 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:47:20 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:47:21 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:47:25 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:47:28 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:47:30 EET 2015 Job1 --->>> Hello geeks! Time is Wed Jan 28 13:47:35 EET 2015 Job2 --->>> Hello geeks! Time is Wed Jan 28 13:47:35 EET 2015
6. Download the Eclipse Project
This was an example of how to schedule jobs with the cron scheduler and trigger of Quartz.
You can download the full source code of this example here: QuartzCronScheduleExample.zip
Thanks!