Today, I was despised by my colleagues. Why? Because, although the quartz expression is often configured, it has never been set up, so I have been here from the beginning to shame.
1. download files from the official website
Http://www.quartz-scheduler.org/
The current version is 2.2 quartz-2.2.0-distribution.tar.gz
2. Learn exampleexample1-your first quartz Program
package org.quartz.examples.example1;import java.util.Date;import org.quartz.DateBuilder;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.Trigger;import org.quartz.TriggerBuilder;import org.quartz.impl.StdSchedulerFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class SimpleExample{ public void run() throws Exception { Logger log = LoggerFactory.getLogger(SimpleExample.class); log.info("------- Initializing ----------------------"); SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); log.info("------- Initialization Complete -----------"); Date runTime = DateBuilder.evenMinuteDate(new Date()); log.info("------- Scheduling Job -------------------"); JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build(); Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build(); sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + runTime); sched.start(); log.info("------- Started Scheduler -----------------"); log.info("------- Waiting 65 seconds... -------------"); try { Thread.sleep(65000L); } catch (Exception e) { } log.info("------- Shutting Down ---------------------"); sched.shutdown(true); log.info("------- Shutdown Complete -----------------"); } public static void main(String[] args) throws Exception { SimpleExample example = new SimpleExample(); example.run(); }}
Initialize schedulerfactory. schedulerfactory has two implementation classes: directschedulerfactory and stdschedulerfactory.
Stdschedulerfactory
Implements the org. Quartz. schedulerfactory interface. It uses a series of attributes (Java. util. properties) to create and initialize a Z scheduler. These attributes are usually stored and loaded in a file, but they can also be created through your program and directly handed over to the factory for processing. Call getscheduler () at the factory to generate a scheduler, initialize it (there are thread pools, jobstore and data sources), and return a handle to this public interface.
Directschedulerfactory
Is another schedulerfactory implementation. It is useful when creating a scheduler in more programming methods. He is not in favor of his usage for the following reasons: 1. It requires users to know more clearly what they are doing. 2. It cannot be configured, that is, you must configure all scheduler attributes in the code.
Jobbuilder
Create a job details by using the given job name job1 and the given group name group1.
Known job types include: directoryscanjob, ejb3invokerjob, ejbinvokerjob, filescanjob, jmxinvokerjob, nativejob, noopjob, senddestinationmessagejob, sendmailjob, sendqueuemessagejob, sendtopicmessagejob
Triggerbuilder
Use trigger builder to set the task start time (next minute)
Register jobdetail and trigger to the scheduler and start the scheduler.
In this way, hellojob will be run at the specified time class
Known trigger types include: calendarintervaltrigger, coretrigger, crontrigger, dailytimeintervaltrigger, mutabletrigger, operabletrigger, simpletrigger
Simpletrigger
Supports Simple cycles and cycles.
Crontrigger
It supports more specific scheduling than simpletrigger, and is not very complex. Based on cron expressions, crontrigger supports calendar-like repetition intervals, rather than a single interval-which is a major improvement for simpletrigger.
Cron expressions include the following seven fields:
Seconds
Minute
Hours
Date in month
Month
Week date
Year (optional)
The cron trigger uses a series of special characters, as shown below:
- The backslash (/) character indicates the increment value. For example, in the second field, "5/15" indicates that the value starts from 5th seconds, every 15 seconds.
- Question mark (?) The characters and letters are only available in the Date Field of the month and the date field of the week. The question mark indicates that this field does not contain specific values. Therefore, if you specify a date in the month, you can insert "?" In the Date Field of the week, Indicates that the date value of the week is irrelevant. The letter L isLast. In the Date Field of the month, the task is executed on the last day of the month. In the week Date Field, if "L" exists separately, it is equal to "7". Otherwise, it represents the last instance of the week date in the current month. Therefore, "0l" indicates that it will be executed on the last Sunday of the month.
- The letter (w) in the date field within the month is executed on the workday closest to the specified value. Place "1 W" in the Date Field of the month, which means that the execution is arranged within the first business day of the month.
- The pound sign (#) specifies a specific workday instance for a given month. Put "Mon #2" in the Date Field of the week, indicating that the task is scheduled for the second Monday of the month.
- The asterisk (*) character is a wildcard character, indicating that this field can accept any possible value.
All these definitions may seem a little scary, but after a few minutes of practice, the cron expression will look very simple.
Calendarintervaltrigger
Unlike simpletrigger, simpletrigger is based on seconds.
Unlike crontrigger, calendarintervaltrigger is based on calendar as the initial time, and then executed every second. The crontrigger's "0/19 ****?" It is triggered only at 00 s, 19 s and 38 s, because crontrigger completes expression-based verification rules,
Dailytimeintervaltrigger
The task is triggered based on the daily interval. The trigger can set the following interval types: seconds, minutes, and hours. In addition, you can specify the days of the week to execute the task.
Example2-simple triggers
package org.quartz.examples.example2;import java.util.Date;import org.quartz.DateBuilder;import org.quartz.DateBuilder.IntervalUnit;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.JobKey;import org.quartz.Scheduler;import org.quartz.SchedulerFactory;import org.quartz.SchedulerMetaData;import org.quartz.SimpleScheduleBuilder;import org.quartz.SimpleTrigger;import org.quartz.TriggerBuilder;import org.quartz.impl.StdSchedulerFactory;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class SimpleTriggerExample{ public void run() throws Exception { Logger log = LoggerFactory.getLogger(SimpleTriggerExample.class); log.info("------- Initializing -------------------"); SchedulerFactory sf = new StdSchedulerFactory(); Scheduler sched = sf.getScheduler(); log.info("------- Initialization Complete --------"); log.info("------- Scheduling Jobs ----------------"); Date startTime = DateBuilder.nextGivenSecondDate(null, 15); JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job1", "group1").build(); SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(startTime).build(); Date ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + (trigger.getRepeatInterval() / 1000L) + " seconds"); job = JobBuilder.newJob(SimpleJob.class).withIdentity("job2", "group1").build(); trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("trigger2", "group1").startAt(startTime).build(); ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + (trigger.getRepeatInterval() / 1000L) + " seconds"); job = JobBuilder.newJob(SimpleJob.class).withIdentity("job3", "group1").build(); trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("trigger3", "group1").startAt(startTime).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build(); ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + (trigger.getRepeatInterval() / 1000L) + " seconds"); trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("trigger3", "group2").startAt(startTime).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(2)).forJob(job).build(); ft = sched.scheduleJob(trigger); log.info(job.getKey() + " will [also] run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + (trigger.getRepeatInterval() / 1000L) + " seconds"); job = JobBuilder.newJob(SimpleJob.class).withIdentity("job4", "group1").build(); trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("trigger4", "group1").startAt(startTime).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(5)).build(); ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + (trigger.getRepeatInterval() / 1000L) + " seconds"); job = JobBuilder.newJob(SimpleJob.class).withIdentity("job5", "group1").build(); trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("trigger5", "group1").startAt(DateBuilder.futureDate(5, DateBuilder.IntervalUnit.MINUTE)).build(); ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + (trigger.getRepeatInterval() / 1000L) + " seconds"); job = JobBuilder.newJob(SimpleJob.class).withIdentity("job6", "group1").build(); trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("trigger6", "group1").startAt(startTime).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40).repeatForever()).build(); ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + (trigger.getRepeatInterval() / 1000L) + " seconds"); log.info("------- Starting Scheduler ----------------"); sched.start(); log.info("------- Started Scheduler -----------------"); job = JobBuilder.newJob(SimpleJob.class).withIdentity("job7", "group1").build(); trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("trigger7", "group1").startAt(startTime).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20)).build(); ft = sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + ft + " and repeat: " + trigger.getRepeatCount() + " times, every " + (trigger.getRepeatInterval() / 1000L) + " seconds"); job = JobBuilder.newJob(SimpleJob.class).withIdentity("job8", "group1").storeDurably().build(); sched.addJob(job, true); log.info("'Manually' triggering job8..."); sched.triggerJob(JobKey.jobKey("job8", "group1")); log.info("------- Waiting 30 seconds... --------------"); try { Thread.sleep(30000L); } catch (Exception e) { } log.info("------- Rescheduling... --------------------"); trigger = (SimpleTrigger)TriggerBuilder.newTrigger().withIdentity("trigger7", "group1").startAt(startTime).withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20)).build(); ft = sched.rescheduleJob(trigger.getKey(), trigger); log.info("job7 rescheduled to run at: " + ft); log.info("------- Waiting five minutes... ------------"); try { Thread.sleep(300000L); } catch (Exception e) { } log.info("------- Shutting Down ---------------------"); sched.shutdown(true); log.info("------- Shutdown Complete -----------------"); SchedulerMetaData metaData = sched.getMetaData(); log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs."); } public static void main(String[] args) throws Exception { SimpleTriggerExample example = new SimpleTriggerExample(); example.run(); }}
One is all
In this example, a new usage occurs. A schedule can be used without specifying a trigger. after adding a job, execute it directly. sched. addjob (job, true); and reset the job sched. reschedulejob (trigger. getkey (), trigger );
Schedulebuilder
Used for cyclic scheduling tasks. The parameters include the number of scheduling times and the interval. There are four implementation classes in total.
Simpleschedulebuilder, calendarintervalschedulebuilder, cronschedulebuilder, dailytimeintervalschedulebuilder
Example3-cron triggers
Package Org. quartz. examples. example3; import Java. util. date; import Org. quartz. cronschedulebuilder; import Org. quartz. crontrigger; import Org. quartz. jobbuilder; import Org. quartz. jobdetail; import Org. quartz. scheduler; import Org. quartz. schedulerfactory; import Org. quartz. schedulermetadata; import Org. quartz. triggerbuilder; import Org. quartz. impl. stdschedulerfactory; import Org. slf4j. logger; import Org. slf4j. l Oggerfactory; public class crontriggerexample {public void run () throws exception {logger log = loggerfactory. getlogger (crontriggerexample. class); log.info ("------- initialize -----------------"); schedulerfactory Sf = new stdschedulerfactory (); scheduler sched = SF. getscheduler (); log.info ("------- initialization completed --------"); log.info ("------- start scheduling task ----------------"); // create a simplejob jobdetail Jo of group1. B = jobbuilder. newjob (simplejob. class ). withidentity ("job1", "group1 "). build (); // create a trigger using the cron expression (triggered every minute for 0, 20, 40 seconds) crontrigger trigger = (crontrigger) triggerbuilder. newtrigger (). withidentity ("trigger1", "group1 "). withschedule (cronschedulebuilder. cronschedule ("0/20 ****? ")). Build (); Date Ft = sched. schedulejob (job, trigger); log.info (job. getkey () + "has been scheduled to run at:" + ft + "and repeat Based on expression:" + trigger. getcronexpression (); // create a job named job2 under group1 = jobbuilder. newjob (simplejob. class ). withidentity ("job2", "group1 "). build (); // trigger for creating a Cron expression = (crontrigger) triggerbuilder. newtrigger (). withidentity ("trigger2", "group1 "). wit Hschedule (cronschedulebuilder. cronschedule ("15 0/2 ***? ")). Build (); Ft = sched. schedulejob (job, trigger); log.info (job. getkey () + "has been scheduled to run at:" + ft + "and repeat Based on expression:" + trigger. getcronexpression (); job = jobbuilder. newjob (simplejob. class ). withidentity ("job3", "group1 "). build (); trigger = (crontrigger) triggerbuilder. newtrigger (). withidentity ("trigger3", "group1 "). withschedule (cronschedulebuilder. cronschedule ("0 0 /2 8-17 **? ")). Build (); Ft = sched. schedulejob (job, trigger); log.info (job. getkey () + "has been scheduled to run at:" + ft + "and repeat Based on expression:" + trigger. getcronexpression (); job = jobbuilder. newjob (simplejob. class ). withidentity ("job4", "group1 "). build (); trigger = (crontrigger) triggerbuilder. newtrigger (). withidentity ("trigger4", "group1 "). withschedule (cronschedulebuilder. cronschedule ("0 0 /3 17-23 **? ")). Build (); Ft = sched. schedulejob (job, trigger); log.info (job. getkey () + "has been scheduled to run at:" + ft + "and repeat Based on expression:" + trigger. getcronexpression (); job = jobbuilder. newjob (simplejob. class ). withidentity ("job5", "group1 "). build (); trigger = (crontrigger) triggerbuilder. newtrigger (). withidentity ("trigger5", "group1 "). withschedule (cronschedulebuilder. cronschedule ("0 0 10 AM, 15 *? ")). Build (); Ft = sched. schedulejob (job, trigger); log.info (job. getkey () + "has been scheduled to run at:" + ft + "and repeat Based on expression:" + trigger. getcronexpression (); job = jobbuilder. newjob (simplejob. class ). withidentity ("job6", "group1 "). build (); trigger = (crontrigger) triggerbuilder. newtrigger (). withidentity ("trigger6", "group1 "). withschedule (cronschedulebuilder. cronschedule ("0, 3 0 **? * MON-FRI ")). build (); Ft = sched. schedulejob (job, trigger); log.info (job. getkey () + "has been scheduled to run at:" + ft + "and repeat Based on expression:" + trigger. getcronexpression (); job = jobbuilder. newjob (simplejob. class ). withidentity ("job7", "group1 "). build (); trigger = (crontrigger) triggerbuilder. newtrigger (). withidentity ("trigger7", "group1 "). withschedule (cronschedulebuilder. cronsch Edule ("0, 30 **? * Sat, Sun ")). build (); Ft = sched. schedulejob (job, trigger); log.info (job. getkey () + "has been scheduled to run at:" + ft + "and repeat Based on expression:" + trigger. getcronexpression (); log.info ("------- starting scheduler --------------"); sched. start (); log.info ("------- started scheduler ---------------"); log.info ("------- waiting five minutes... ------------ "); try {thread. sleep (300000l);} catch (exception e) {} log.info ("------- shutting down ---------------------"); sched. shutdown (true); log.info ("------- shutdown complete -----------------"); schedulermetadata metadata = sched. getmetadata (); log.info ("executed" + metadata. getnumberofjobsexecuted () + "jobs. ");} public static void main (string [] ARGs) throws exception {crontriggerexample example = new crontriggerexample (); example. run ();}}
It mainly uses cronschedulebuilder. cronschedule ("0 0 10 am, 15 *? ") Usage of these cron expressions.
Example4-job state and job parameters
Example5-job misfires
Example6-handling job exceptions
Example7-Interrupting jobs
Example8-how to use quartz calendars
Example9-using job listeners
Example10-using quartz plug-ins
Example11-loading up quartz with dynamic jobs
Example12-remoting with quartz using RMI
Example13-clustering quartz and JDBC job stores
Example14-quartz trigger priorities
Example15-clustering quartz and Terracotta job store