Quartz 1.6.0 Release Notes

This release contains significant new features, bug fixes and improvements to Quartz.

See the changelog below for complete details of this release.

Most Significant of New Features

  • JMS Integration. Some JMS-related features (such as a send-message job) are now included with Quartz. This feature set will increase over the next few releases of Quartz.
  • Utility classes BroadcastSchedulerLister, FilterAndBroadcastJobListener, FilterAndBroadcastTriggerListener, and JobChainingJobListener

Other Key Changes

  • Improvements to efficiency in several areas of the codebase.
  • A Trigger is now not "acquired" by the scheduler until there is a thread available (in the ThreadPool) to execute it. This will lead to improved load balancing within a clustered setup, as well as other benefits.
  • Ability to specify a locking semaphore implementation when using JDBC JobStore.
  • Convenience classes JobListenerSupport, SchedulerListenerSupport, TriggerListenerSupport.
  • Many more!

Core API changes

  • Introduced Trigger.setPriority(int)

Migration Notes

Necessary Code Changes

Version Description Old Code New Code
1.5.x no changes necessary    

RAMJobStore users should be wary about the changes made for bug QUARTZ-107 - if your code was written properly, there's nothing to worry about, but if you improperly relied on mutating a job or trigger without restoring them, your code will now be broken.

Necessary Database Changes (if using JDBC-JobStore)

Version Description update command(s)
1.5.x Add "priority" column to the "qrtz_fired_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_fired_triggers add PRIORITY NUMBER(13)
1.5.x Add "priority" column to the "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 PRIORITY NUMBER(13)
1.5.x Migrate existing trigger entries to have default priority. update qrtz_triggers set PRIORITY = 5 where PRIORITY IS NULL
update qrtz_fired_triggers set PRIORITY = 5 where PRIORITY IS NULL

Changelog

OpenSymphony JIRA (146 issues)
T Key Summary
Improvement QUARTZ-13 Don't "acquire" next trigger until thread pool has thread available.
Bug QUARTZ-107 different operation between RAMJobStore and JobStoreTX
Improvement QUARTZ-204 Need to daemonize scheduler thread, clustermanager, & misfirehandler
Bug QUARTZ-222 Exception "Pool not open" occurs if immediately shutdown scheduler after start it up.
New Feature QUARTZ-235 A Job implementation calling ANT script
New Feature QUARTZ-236 JMS Integration Features
New Feature QUARTZ-237 New base functionality classes for JobListeners and TriggerListeners
New Feature QUARTZ-238 Job Chaining
Improvement QUARTZ-243 Enable attaching plugins when using DirectSchedulerFactory
Improvement QUARTZ-246 Letting jobs access to scheduler plugins
New Feature QUARTZ-249 Priority scheduling
New Feature QUARTZ-258 Job prioritization and related
Bug QUARTZ-289 Null pointer during quartz shutdown
Bug QUARTZ-293 JobStore.shutdown called before releaseAcquiredTrigger()
Bug QUARTZ-295 JobInitializationPlugin sycnro problems
New Feature QUARTZ-300 JMX Management
Sub-task QUARTZ-301 jobs configured using JobInitializationPluginMultiple do not execute, but works in JobInitializationPlugin
Bug QUARTZ-306 changed behaviour of RAMJobStore from quartz 1.5 to 1.6 head
Improvement QUARTZ-321 Apply double check locking to JobStoreSupport.MisfireHandler
Improvement QUARTZ-322 Improve Scheduler GlobalJobListener interface
Improvement QUARTZ-323 A Job implementation for auto cleaning log dirs
Bug QUARTZ-324 build.xml looking for osbuild.xml in wrong location
Improvement QUARTZ-325 Code Cleanups
Bug QUARTZ-326 CLONE -InitialContext not being closed, potential resource leak
Improvement QUARTZ-327 Support Timezone in CronCalendar
Improvement QUARTZ-328 NthIncludedDayTrigger should support timezone
Bug QUARTZ-329 Restore connection auto commit/transaction isolation props
Bug QUARTZ-330 Cut&Paste typo in CronTrigger.updateAfterMisfire() javadoc
Bug QUARTZ-331 Issues with cluster management refactoring
Task QUARTZ-332 Remove QRTZ_SCHEDULER_STATE.RECOVERER column
Bug QUARTZ-333 Handle orphanded QRTZ_FIRED_TRIGGERS record recovery
Task QUARTZ-334 Add serialVersionUID to CronCalendar
Task QUARTZ-335 SchedulerException should take Throwable rather than Exception
Bug QUARTZ-336 tables_firebird.sql - INSTANCE_NAME is VARCHAR(60) not INSTANCE_NAME(80)
Improvement QUARTZ-337 Make so that EJBInvokerJob does context.setResult()
Improvement QUARTZ-338 Create base plugin class that supports wrapInUserTransaction
Task QUARTZ-339 Make UserTransactionHelper globally available
Task QUARTZ-341 Update FAQ with some Oracle advise
Improvement QUARTZ-344 Conditionally build quartz-weblogic.jar based on Weblogic class that is actually used
Bug QUARTZ-345 Javadocs do not include weblogic/jboss/oracle packages
Bug QUARTZ-346 Cleanup javadoc warnings
Task QUARTZ-347 Remove redundant commons-beanutils-bean-collections.jar and commons-beanutils-core.jar from lib/optional
Bug QUARTZ-348 Fix javadoc location for j2ee 1.3
Task QUARTZ-349 Create a quartz-all.jar that includes all other jars.
Bug QUARTZ-350 Rename or move quartz-service.xml (in jboss subproject) so doesn't get loaded automatically by JBoss
Task QUARTZ-351 Include jboss/oracle/weblogic subproject source in javadoc
Task QUARTZ-353 Correct JavaDoc in CronExpression
Improvement QUARTZ-354 Improvements to NthIncludedDayTrigger fireAtTime
Task QUARTZ-355 Cleanup QuartzService MBean javadoc
Bug QUARTZ-356 Close InputStreams in DriverDelegates in finally block
Task QUARTZ-357 Factor out ResultSet and Statement closing
Bug QUARTZ-358 DirtyFlagMap does not flag changes made via entrySet()
Improvement QUARTZ-359 Improve Map iteration performance
Bug QUARTZ-360 PropertySettingJobFactory should handle unmatched primitive parameters and null values
Task QUARTZ-361 Factor out a common base class for JobDataMap and SchedulerContext
Improvement QUARTZ-362 Improve handling of non-Serializable values in a JobDataMap
Bug QUARTZ-364 Inconsistency in JobStoreCMT/TX.triggerFired()
Bug QUARTZ-365 JobStoreTX/CMT.doCheckin() doesn't always commit cluster checkin
Task QUARTZ-366 Refactor JobStoreCMT/TX/Support to reduce duplicate code
Improvement QUARTZ-367 Stop trying to delete trigger sub-table row once found
Improvement QUARTZ-368 When deleting job after last trigger is deleted, don't check again if job has triggers
Task QUARTZ-369 Normalize Log Lookup and Use
New Feature QUARTZ-370 Create no-op support classes for Listeners
Improvement QUARTZ-371 Don't delete/reinsert own instance during cluster recovery
Task QUARTZ-374 Add checkstyle support
Task QUARTZ-375 Add serialVersionUID to all Calendars and Blob Triggers
Bug QUARTZ-379 Make Scheduler listener access thread-safe
Improvement QUARTZ-383 Relative path of the XML configuration file
Bug QUARTZ-384 JDBCJobStores storeTrigger() don't throw ObjectAlreadyExistsException as javadoc states
Bug QUARTZ-390 PropertiesParser cleanup
Bug QUARTZ-394 Factor out duplicate code in DB2v8Delegate/DB2v7Delegate (and fix minor bugs)
Bug QUARTZ-395 TriggerUtils.makeSecondlyTrigger creates SimpleTrigger with null startTime
Bug QUARTZ-396 NullPointerException when calling CronExpression.isSatisfiedBy(java.util.Date date) with a future date
Bug QUARTZ-397 Don't cache Calendars in JobStoreSupport when clustering
Bug QUARTZ-399 StackOverflowError caused by the Triggers dataMap containing data.
Bug QUARTZ-401 EJBInvokerJob closes JNDI context too early (authentication problem)
Improvement QUARTZ-402 Remove the MISFIRE Trigger State
Bug QUARTZ-403 No timezone support in calendars
Bug QUARTZ-404 Inconsistent day value in setDayExcluded and isDayExcluded in MonthlyCalendar.java
Bug QUARTZ-405 Storing custom triggers is broken
Improvement QUARTZ-408 Consolidate JobStoreSupport helper methods getNewStatusForTrigger() and getStatusForResumedTrigger()
Bug QUARTZ-409 AccessControlException initializing StdSchedulerFactory
Improvement QUARTZ-410 Use the JobExecutionContext MergedJobDataMap in Quartz provided Jobs
Improvement QUARTZ-411 Update SendMailJob to support content type and easier extension
Improvement QUARTZ-412 Add support for Trigger JobDataMap to JobInitializationPlugin
Bug QUARTZ-414 EJBInvokerJob does not find create() from home interface superclass
Bug QUARTZ-415 Don't throw an exception from JobStoreSupport.rollbackConnection()
Improvement QUARTZ-416 Don't hold db connection while waiting for SimpleSemaphore lock
Sub-task QUARTZ-417 Don't lose extra fields of custom triggers that extend Cron/SimpleTriggers
Sub-task QUARTZ-418 Make Trigger Listeners transient so they aren't double loaded for BLOB Triggers
Bug QUARTZ-420 SmartPolicy Missfire Instruction in a SimpleTrigger can cause RuntimeException if after end time
Bug QUARTZ-421 Trigger with empty JobDataMap can't be loaded in MySQL
New Feature QUARTZ-422 Scheduler.isStarted( ) dont exist.
Sub-task QUARTZ-424 Clarify that CronTrigger.getFinalFireTime()/getTimeBefore() are not implemented
Task QUARTZ-426 Deprecate SchedulerMetaData.isPaused() in favor of isInStandbyMode()
Sub-task QUARTZ-427 JobInitializationPlugin should allow non-durable job without triggers to add to overwrite an existing job with triggers
New Feature QUARTZ-429 Support setting properties of InstanceIdGenerator
Bug QUARTZ-430 Redundant check in SimpleTrigger.getFireTimeAfter()
Bug QUARTZ-432 Having a TriggerListener veto a StatefulJob strands the Trigger in BLOCKED state
Improvement QUARTZ-433 Support custom RMI bind name for Scheduler
Bug QUARTZ-434 JobInitializationPlugin XML validating is broken for XSD
Bug QUARTZ-435 Cluster recovery does not remove COMPLETE Triggers
Bug QUARTZ-436 QuartzInitializerListener/Servlet do not initialize StdSchedulerFactory if using default config-file, but start-scheduler-on-load is false
Improvement QUARTZ-437 Allow user to choose name under which StdSchedulerFactory is stored in ServletContext in QuartzInitializerServlet/Listener
Bug QUARTZ-438 JobDetail.addJobListener()/Trigger.addTriggerListener() should enforce unique listener names
New Feature QUARTZ-441 Support custom Semaphore (lock handler) implementations
New Feature QUARTZ-442 Add TransactionManager aware Semaphore implementation
Bug QUARTZ-444 Javadoc for CronCalendar contains a wrong example
Bug QUARTZ-445 CronCalendar.getNextIncludedTime() loops forever
Improvement QUARTZ-446 Improve on interface JavaDoc for Calendar.java
Improvement QUARTZ-448 Use Throwable.initCause()/getCause() when available
Improvement QUARTZ-449 Return JMXInvokerJob result in JobExecutionContext.setResult()
Improvement QUARTZ-450 Thread groups created by quarts are not cleaned up
Bug QUARTZ-452 Deprecate name related constructors/methods in CronCalendar and DailyCalendar
Task QUARTZ-453 Clarify that bound Scheduler instance is not Serializable in QuartzService javadocs
Sub-task QUARTZ-455 Make clear in javadocs that Scheduler.getCurrentlyExecutingJobs() and interrupt() are not cluster aware.
Bug QUARTZ-458 Issues with mutable flag on JobDataMap
Bug QUARTZ-459 Priority inconsistently set on recovery triggers
Bug QUARTZ-460 MonthlyCalendar setDayExcluded malfunctions
Bug QUARTZ-463 Most flexible DirectSchedulerFactory.createRemoteScheduler() method is protected
Task QUARTZ-466 Improve build documentation
Bug QUARTZ-467 RemoteScheduler does not remove itself from SchedulerRepository
Bug QUARTZ-470 JobStore.acquireNextTriggers called by QuartzSchedulerThread before JobStore is started
Improvement QUARTZ-471 Handle null JobDetail/Trigger in QuartzScheduler.scheduleJob() methods.
Bug QUARTZ-472 When a Job is not found, skip trying to load its listeners
Bug QUARTZ-473 typo in Trigger.clone() - triggerListeners aren't copied
Bug QUARTZ-476 NthIncludedDayTrigger.mayFireAgain() returns incorrect result
Bug QUARTZ-477 Wrong Javadoc for JobDetail.getFullName()
Improvement QUARTZ-478 CronExpression.getNextValidTimeAfter() helper method may yield an endless loop
Improvement QUARTZ-479 Return process exit value from NativeJob
Bug QUARTZ-487 Confusing Javadoc in JobStoreSupport for instanceId and instanceName
Bug QUARTZ-490 Scheduling change causes a paused/blocked scheduler to do unnecessary trigger release
Bug QUARTZ-491 SimpleThreadPool can lose a runnable
Bug QUARTZ-492 Different behavior calling TriggerListener.triggerFired() depending on which kind of JobStore is being used.
Improvement QUARTZ-493 Add option to not start scheduler to JBoss QuartzService MBean
New Feature QUARTZ-497 MS SQL Semaphore solution
Bug QUARTZ-498 SecondlyTrigger does not start correctly
Bug QUARTZ-499 org.quartz.xml.ValidationException while parsing jobs.xml file (CronExpression containing year) using JobSchedulingDataProcessor
Bug QUARTZ-500 Typo in tables_postgres.sql - PostreSQLDelegate -> PostgreSQLDelegate
Improvement QUARTZ-501 Add JobExecutionException(String msg, Throwable cause) constructor.
Bug QUARTZ-502 Deadlock on clusterCheckIn Resolution
Bug QUARTZ-503 TriggerUtils.makeSecondlyTrigger slightly broken
Improvement QUARTZ-510 JobExecutionException missing one more constructor
Bug QUARTZ-514 Handle java.lang.Error during Job exeuction
Bug QUARTZ-519 NullPtrException in PropertiesParser.getPropertyGroup() for empty properties
Bug QUARTZ-520 SchedulerException.toString() throws a java.lang.StackOverFlow exception