## Quartz 1.5.0 Release Notes This release contains serveral significant new features and improvements, as well as a host of bug fixes. See the ChangeLog further below for a complete listing of the nearly 60 changes in this release. ### Significant New Features Triggers may now have JobDataMaps associated with them. This can be useful in the case where you have a Job that is stored in the scheduler for regular/repeated use by multiple Triggers, yet with each independent triggering, you want to supply the Job with different data inputs. The JobDataMap that is now found on the JobExecutionContext (via the getMergedJobDataMap()) during Job execution serves as a convenience. It is a merge of the JobDataMap found on the JobDetail and the one found on the Trigger, with the value in the latter overriding any same-named values in the former. New Trigger Type: NthIncludedDayTrigger. This is a trigger which fires on the Nth day of every month or year that is not excluded by the associated calendar. See it's JavaDoc for full features and behavior description. User Defined JobFactories. Users can now define their own mechanisms for instantiating Jobs. This feature will be useful to those who would like to take advantage of IoC container features, such as dependency injection. See new method: Scheduler.setJobFactory(org.quartz.spi.JobFactory). PropertySettingJobFactory. A JobFactory type that will reflectively set properties on a Job from values in the JobDataMap after the job is instantiated. Direct support for more databases: Derby, DB2 version 8. ### Key Changes Quartz is now distributed under the Apache 2.0 license. There is no longer a limit on the number of threads that a SimpleThreadPool can have. Various improvements and new features in JobInitializationPlugin and related jobs xml format. ### Core API changes It is no longer necessary to specify a group name on a Job or Trigger, if left unset or set to null, Scheduler.DEFAULT_GROUP will be used. org.quartz.helpers.TriggerUtils class moved up to main package, so it is now org.quartz.TriggerUtils. The old version of the class was left behind but deprecated. Various small API cleanups involving deprecations of old methods. ### Migration Notes Necessary Code Changes
Version | Description | Old Code | New Code
--- | --- | --- | ---
1.4.x | no changes necessary |  |
Necessary Database Changes (if using JDBC-JobStore)
Version | Description | update command(s)
--- | --- | ---
1.4.x | Add Blob column for JobDataMap to QRTZ_TRIGGERS table. This example update SQL is for Oracle. Make sure you use the appropriate data type for your database, which can be found in the tables_xxx.sql file for your db. You should leave the value of this new column NULL for existing rows. | alter table QRTZ_TRIGGERS add JOB_DATA BLOB
### Changelog
OpenSymphony JIRA (59 issues)
T | Key | Summary
--- | --- | ---
| QUARTZ-251 | Add a static makeImmediateTrigger(..) method to TriggerUtils
| QUARTZ-250 | Cron Expression doesn't work for Wednesday
| QUARTZ-245 | log4j.properties is specified instead of log4j.xml in clusterExample_*.bat
| QUARTZ-242 | quartz_jobs.xml should be loaded using url.openStream() instead of using FileInputStream
| QUARTZ-233 | org.quartz.plugin.jobInitializer.overWriteExistingJobs does not work!
| QUARTZ-232 | Store the StdSchedulerFactory in the ApplicationContext during init() of QuartzInitializerServlet
| QUARTZ-231 | Use of String.toUpperCase() may be unsafe for non English locales
| QUARTZ-225 | Ignore redundant scheduler shutdown calls
| QUARTZ-224 | Clarify docs to prevent potential Oracle DB lock
| QUARTZ-223 | New Trigger-level JobDataMaps feature needs to work with recovering triggers.
| QUARTZ-221 | Add new JobFactory type -PropertySettingJobFactory
| QUARTZ-220 | Make Scheduler.DEFAULT_GROUP more default - don't force specification when creating Jobs and Triggers
| QUARTZ-219 | Move TriggerUtils to main package.
| QUARTZ-218 | Allow specification of RMI Port the Quartz Scheduler binds to.
| QUARTZ-216 | Allow association of JobDataMaps with Triggers
| QUARTZ-215 | New Firebird DB 1.5 Script
| QUARTZ-213 | Switch Quartz to Apache 2.0 License
| QUARTZ-211 | scheduleJob unpauses existing Triggers for StatefulJobs
| QUARTZ-210 | Use of Thread.currentThread().getContextClassLoader() in JobStoreSupport
| QUARTZ-208 | The method createVolatileSchduler() is misspelled
| QUARTZ-207 | Remove unnecessary field for Cron Trigger Table structure for SapDB
| QUARTZ-206 | Derby DB Support
| QUARTZ-205 | Add support to search for jobs by name on the List Jobs page
| QUARTZ-203 | UnResolved text properties after invalid logon
| QUARTZ-202 | Cannot compile oracle jdbcjobstore components without WebLogic
| QUARTZ-200 | Load XML Definition from InputStream
| QUARTZ-198 | EJBInvoker enhancement for real life applications
| QUARTZ-196 | Default CronTrigger constructor doesn't set valid field values
| QUARTZ-194 | Log message in JobSchedulingDataProcessor.scheduleJobs not accurately reporting number of jobs scheduled.
| QUARTZ-193 | CronTrigger: Remove e.printStackTrace() in line 1140
| QUARTZ-192 | Support config file extensions in JobSchedulingDataProcessor
| QUARTZ-190 | Click on "listJobs" in the webapp and click on View for any listed job.Then click on Edit and change the "recover" and "KeepJobsFinished" check boxes and click on "Save".Observe that updated "recover" checkbox is not updated correctly
| QUARTZ-187 | After the web app is up, go to Schedule Control page, click the button stop the scheduler, Scheduler status is shown as "Paused".Actually the scheduler is stopped.(where only default scheduler is running)
| QUARTZ-184 | QuartzInitializerServlet destroy bug
| QUARTZ-183 | Error in cronType in job_scheduling_data_1_1.xsd
| QUARTZ-181 | QuartzInitializerServlet only shuts down DefaultScheduler on destroy.
| QUARTZ-178 | New NthIncludedDayTrigger
| QUARTZ-177 | Small bug in org.quartz.helpers.TriggerUtils.validateDayOfMonth
| QUARTZ-175 | JDBCJobStore can't connect to DataSource
| QUARTZ-173 | Incompatible field in tables_sapdb.sql.
| QUARTZ-171 | Suggested minor change to the StdScheduleFactory
| QUARTZ-169 | DB2v8Delegate
| QUARTZ-167 | In Quartz Web App - Unable to click on column headers in job listing
| QUARTZ-166 | Scheduling a native job for Windows 2003 is different than other versions of windows
| QUARTZ-163 | ClusterManager may yield a ThreadDeath in Tomcat on shutdown
| QUARTZ-158 | Order of execution of misfired triggers
| QUARTZ-157 | bug in org.quartz.jobs.NativeJob
| QUARTZ-156 | Remove historical 200 thread limit on SimpleThreadPool
| QUARTZ-154 | JobInitializationPlugin: findFile() does not work if jobs.xml inside jar-file (in classpath)
| QUARTZ-147 | RuntimeException/Error can kill QuartzSchedulerThread, disable scheduler
| QUARTZ-140 | Adding Job listener in XML job initialization plugin
| QUARTZ-137 | Add more detailed logging to JTAJobRunShell
| QUARTZ-132 | JobInitializationPlugin should accept multiple job files
| QUARTZ-94 | FileScanJob : jobs.xml doesnot exists
| QUARTZ-74 | Job Description in xml job definition
| QUARTZ-40 | Durability and Recovery Turned Off on Job Edit
| QUARTZ-32 | More Flexible Job Instantiation
| QUARTZ-19 | Don't start misfire handling until scheduler.start() has been invoked
| QUARTZ-10 | Document new features in 1.3.4 and 1.4.0