- Job: What to do
- Trigger: When to do it
- Scheduler: The director to associate triggers to jobs and to invoke the trigger
A job can be associated with several triggers, but a trigger should not be used to trigger more than one job
Go into details for some depth
- JobKey = Job Name + Job Group, TriggerKey = Trigger Name + Trigger Group: The `name` and `namespace` of these things, i.e. the ID
- Jod Data Map: The context for jobs or triggers
Somethings that may be confusing
- Job detail: Running instance of a job (IMAO, It’s overdesign) . For a single HelloJob class, you can create a JobDetail based on it called `fooJobDetail` and another called `barJobDetail`, each has its own Job Data Map and its own JobKey
- DisallowConcurrentExecution: If it is set up on HelloJob class, then only one process of "fooJobDetail" can be run at the same time; But you can run `barJobDetail` at the same time.
- JDBC-JobStore: Not only job, but schedulers/triggers/jdbcDataMap can be saved into database. You can use jdbc configurations as well as dataSource
- Single-node firing: With Jbdc-JobStore you can make sure only one node will fire the job for each firing. All you need to do is to set `org.quartz.jobStore.isClustered = true`
- Fail-over: fail-over can also be done if `org.quartz.jobStore.isClustered = true` and the JobDetail`s `request recovery` flag is set to true).
Things that can be handy
- Calendar: If you have trigger that fires everday but not during public holdays, you can use this
- Job/Trigger/Scheduler Listeners: an interface to let you plugin some callbacks when something is done. Can be handy for monitoring or auditing purposes.
To make things more robust
- RequestsRecovery: After you recover from a `hard shutdown`, when the scheduler starts again, the job that went away during the hard shutdown will be re-executed. This only applies to persistent jobs.
- Misfire Instructions: A trigger may not be fired when it should. When a scheduler is started again, it will find out all misfired trigger to do something, such as MISFIRE_INSTRUCTION_FIRE_NOW or MISFIRE_INSTRUCTION_DO_NOTHING. This only applies to persistent triggers.
- DirectSchedulerFactory: with this you don’t have to use quartz.properties but rather configure them in a programatic way