

Quartz is an enterprise-class Job Scheduler for use in stand-alone and 
full-blown J2EE Applications.

Quartz is very light-weight, highy scalable, and extremely easy to use within 
your own applications.


* Please read the license agreement (license.txt) that is distributed with this 
package.


================================================================================
Quartz 1.4.4 Release Notes
================================================================================

This is release contains bug fixes as well as some minor feature improvements.


================================================================================
Changes in version 1.4.5  (since version 1.4.4)
================================================================================

1- Quartz now fully works under JRE 1.5  (there was a problem with trigger
   comparators).

2- Fixed a bug introduced in the last release with using 
   JobInitializationPlugin when also using JDBC-JobStore.
   
3- Fixed a bug related to loading the job xml DTD for validation when using
   Quartz from Spring.
   
4- Made improvements for using JobSchedulingDataProcessor from within a
   Servlet.

5- Improved logging in a few spots.

6- A few other very small and rare bugs.



================================================================================
Changes in version 1.4.4  (since version 1.4.3)
================================================================================

1- Fixed a bug when using the no-arg consctructor of MonthlyCalendar.

2- Fixed a possible infinitle-loop in RAMJobStore that was introduced in 1.4.3.

3- Made improvements to the XML processing in JobSchedulingDataProcessor, 
   such that when using the non-default scheduler, a second scheduler isn't 
   mistakenly produced.
   
4- Made a new delegate "WebLogicOracleDelegate" for use with JDBC-JobStore when
   using the Oracle thin drivers within Weblogic 8.1.  If you use Weblogic's
   own drivers for Oracle, you should still use the "WebLogicDelegate".  If
   you use Oracle's drivers directly, you should still use "WebLogicDelegate".
   
5- Added db table-creation script changes for PostgreSQL 8.0

6- Improved EJBInvokerJob such that it does not require app-server parameters
   when looking up the InitialContext.
   
7- Various extremely minor bugs.

8- Improved handling of loading of configurations (both the config properties
   file, and the xml file when using JobInitializationPlugin) - the file can
   no be more readily found under the classpath (e.g. inside a WAR file), vs.
   in the main working directory of the app.

9- Fixed a recently introduced bug related to rescheduling a trigger that has 
   completed all firings during the execution of the job (or its listeners).
   

   

================================================================================
Changes in version 1.4.3  (since version 1.4.2)
================================================================================

1- Fixed bug: JobSchedulingDataProcessor (used by JobInitializationPlugin) 
   mistakenly used the job's group name (rather than the trigger's group name)
   when rescheduling a job.

2- Various small documentation fixes.

3- org.quartz.ee.ejb.EJBInvokerJob now finds the method to call by using
   Class.getMethod() rather than Class.getDeclaredMethod() - which helps in
   cases where the method is inherited.
   
4- "quartz-service.xml" (for the JBOSS mbean) is no longer built into the
   standard Quartz jar file, as it caused problems for users who use jboss,
   but not the mbean.
   
5- Fix bug in MonthlyCalendar.isDayExcluded(int day)

6- Fix possible NPE when replacing a calendar and specifying to update 
   associated triggers
   
7- Fix bug with interpreting value of "shutdown-on-unload" property of the
   QuartzInitializerServlet.
   
8- Fixed bug in determining recoverability of a job as it's trigger is being
   replaced.
   
9- Improved JobInitializationPlugin's handling of xml files in the classpath.

10- Various very minor bugs (see changelist in JIRA if interested).



================================================================================
Changes in version 1.4.2  (since version 1.4.1)
================================================================================

1- New feature:  JobExecutionContext contains a map which you can use to share
   data between JobListeners, TriggerListeners and the Job itself, via the new
   put(key, value) and get(key) methods.
   
2- Fixed bug: possible ClassCastException in AnnualCalendar.isDayExcluded().

3- Fixed bug: RAMJobStore.getJobNames() synchronized on wrong lock leading to
   possible ConcurrentModificationException.
   
4- Misc documentation fixes.

5- Improvement: NativeJob now has an optional parameter that specifies whether
   the job should wait for the completion of the system process or not.

6- Fixed bug: can not create the job with same name but diffrent group name 
   using JobInitializationPlugin
   
7- Fixed bug: apparently some of the locks that were removed during 1.4.0 to
   improve performance when inserting new job/triggers are necessary to avoid
   deadlocks under high load when using particular RDBMSs (such as MS SQL
   Server).  These locks   were put back in place, but can be turned off with 
   the new config property "org.quartz.jobStore.lockOnInsert = false" (which 
   defaults to true), if you desire the performance improvements and deadlocks 
   aren't an issue for you.

8- Fixed recently introduced bug with serialization of CronTrigger.

9- Improvement:  The name of the main QuartzSchedulerThread can be explicitly
   set with the new property "org.quartz.scheduler.threadName".
   
10- New feature: Global JobListeners and TriggerListeners can be added to the
   scheduler at initialization by placing configuration for them in the 
   quartz.properties file.  This works in the same way that adding plug-ins 
   works.  See docs/example_quartz.properties for details.

11- Fixed bug:  If a job is executed for a trigger's last scheduled fire time,
   and the trigger was rescheduled during the job execution, the new trigger 
   was erroneously deleted at the end of the job execution as if it was the old 
   trigger.


================================================================================
Quartz 1.4.1 Release Notes
================================================================================

This is release contains fixes to a few glitches that made it into 1.4.0, as
well as some very minor feature improvements.


================================================================================
Changes in version 1.4.1  (since version 1.4.0)
================================================================================

1- MSSQLDelegate and DB2b7Delegate classes were missing required constructors
   for when useProperties is set to true from JDBC-JobStore.
   
2- Reduced (even more) the noisyness of logging during db failures .

3- Made CronTrigger more extensible by changing access modifiers of 'private'
   methods to 'protected'.
   
4- Added public setEndDate(Date) method to Trigger - the base class of all
   Triggers.
   
5- Fixed type-o in name of the method setJobFailedMessage(String) on 
   LoggingJobHistoryPlugin (and deprecated the type-o'd version of the method).
   
6- Improved LoggingJobHistoryPlugin and LoggingTriggerHistoryPlugin so that the
   expense of generating the messages is not taken unless the log-level is set
   such that it will actually log something.  Also changed the log level for
   the JobWasExecuted(..) event to 'warn' in the case of a thrown 
   JobExecutionException, and includes the stack trace in the logging.

7- Hushed non-important ClassNotFoundExceptions that could randomly occur 
   during shutdown when using Tomcat.

8- Added JobExecutionContext.getJobRunTime() which returns the number of
   milliseconds for which the job was within its execute() method (only valid
   after execution is complete).

9- Fixed bug in RAMJobStore where triggers that fire StatefulJobs may end up
   permanently "blocked" if stored while the job is currently executing.



================================================================================
Quartz 1.4.0 Release Notes
================================================================================

This is release contains feature enhancements, performance improvments, and
bug fixes.  There are a few backward compatibility issues that you should pay
attention to, which are listed in the change-list.

Special thanks to Chris Bonham for the work he did on this release.


* Take special of the changes that created backward-incompatibilities: 
    * #3 (xml files)
    * #6 (trigger listeners, job listeners)
    * #10 (history plugins)
    * #11 (add calendar)
    * #13 (trigger states)


================================================================================
Changes in version 1.4.0  (since version 1.3.4)
================================================================================

1- Performance improvements with JDBC-JobStore when storing and updating 
   triggers.  
   
2- Misc small bug fixes and documentation improvements.
     Notable fixes:
       - Fixed a bug with scheduler.getTriggerState() when using RAMJobStore.
       - Fixed a bug CronTrigger.willFireOn(..) not working properly when cron
         expression included a day-of-week clause
       - Fixed a bug with triggers where if you set the end-time before setting 
         the start-time it was possible to specify an end-time that occurred 
         before the start-time.
       - Fixed a bug related to recovery of StatefulJobs - triggers could get
         'stuck' in the BLOCKED state.
       - Fixed a bug related to recovery of StatefulJobs - triggers that have
         no more fire times, and don't request recovery could get recovered 
         anyway.
       - Fixed 'noisy-ness' of ClusterManager and MisfireHandler (of 
         JDBC-JobStore) when the db connection is lost. (they now pause for the 
         interval specified in the configuration property 
         'org.quartz.scheduler.dbFailureRetryInterval')
       - Fixed a bug with paused trigger groups that have no triggers in them -
         the first trigger added with that group after a restart would not end
         up paused.

3- Overhaul of XML support for initializing jobs and triggers from an XML file.
   This includes new capabilities for populating the JobDataMap, support for
   multiple triggers per job, and other improvements.
   
   JobInitializationPlugin was updated to include specifying a "scan interval"
   at which the job config (xml) file will be periodically scanned for updates.
   
   
4- New CronTrigger feature: 'W' character for day-of-month expression.  The 'W'
   character signifies nearest weekday.  As examples, if the day-of-week 
   expression is 15W and the 15th of the month is a Saturday, then the trigger
   will occur on Friday, but if the 15th is a Sunday, the trigger will occur
   on Monday.  
   
   This new character can also be specified in conjunction with the 'L' 
   character (last day of month), thus the value 'LW' for day-of-month means
   last weekday of the month.  Likewise, "1W" is first weekday of the month.
   
5- Add new convenience feature Scheduler.getPausedTriggerGroups() which returns
   a set of names for the trigger groups that are currently paused.
   
6- Added new mechanism for TriggerListeners to "veto" the execution of a Job
   (keep the job from being executed during this firing of the trigger).
   See new method "vetoJobExecution(..)" on the TriggerListener interface.

   In conjunction with this change, JobListeners now receive the new event
   call-back jobExecutionVetoed(..).
   
7- Added new (overloaded) version of CronTrigger.willFireOn(Calendar) with the
   new signature willFireOn(Calendar, boolean),  If the new boolean parameter
   is set to true, the method will only determine if the trigger will fire 
   during the day represented by the given Calendar (hours, minutes and seconds 
   will be ignored).
   
8- Introduced new interface for jobs:  InterruptableJob, providing a hook for
   requesting executed jobs to be interrupted.  Please read the documentation
   on that interface, as well as the JavaDoc on the new Scheduler.interrupt(..)
   method.
   
9- Improved EJBInvokerJob so that you can specify JNDI configuration properties
   for locating the EJB.
   
10- Introduced new JobExecutionContext.set/getResult().  Jobs can set an object
   as the 'result' of their execution, and JobListeners and TriggerListeners
   can view the result.  The result means nothing to Quartz itself.  
   
   LoggingJobHistoryPluggin has been changed to include logging of the result.
   This change required creating an additional message to distinguish logging
   when there is a result, or when the job failed (threw a 
   JobExecutionException).  If you use LoggingJobHistoryPlugin, your 
   configuration may need to change (if you customize the messages).  At the
   minimum you should be aware that the logged messages are now a bit different.
   
11- Introduced new SimpleThreadPool config property that determines whether
   the thread pool's ThreadGoup is a child of the thread group of the
   initializing thread.  The default value is "true" - which is what the
   behavior has always been.
   org.quartz.threadPool.threadsInheritGroupOfInitializingThread = true
   
12- Signature of Scheduler.addCalendar(Calendar, boolean) changed to 
    Scheduler.addCalendar(Calendar, boolean, boolean) - where the second
    boolean specifies whether to update all existing triggers that reference
    the existing calendar to be 'correct' relative to the new Calendar.
    
14- Additional detail is now returned from the call Scheduler.getTriggerState(),
    specifically the state of "BLOCKED" is returned, rather than "NORMAL" when
    the trigger is in a state where it can't be fired because the associated
    job is a StatefulJob, and it is currently executing.  If you had logic
    testing for the "NORMAL" state, you should review your logic for the
    handling of the possible new "BLOCKED" state.
    
15- Added ability to populate string name-value pairs into the scheduler context
    during initialization.  The new config property prefix for doing this is
    'org.quartz.context.key'.  See the docs/config/example_quartz.properties 
    file for more detail.

  

  