HOWTO: Scheduling Cron Style Timers and Jobs with Spring and Quartz

| No TrackBacks
Spring Timer's are great if you need a job or task to run on a fixed interval.  For example, if you need a bean to wake up and run itself every 30-minutes.  But what if you need finer control over the scheduling of a timer?  Say you need a job to run every morning at 3AM, regardless of when the JVM is started.  Or, say you need a bean to run "every half hour between the hours of 8 AM and 10 AM on the 5th and 20th of every month."  You won't get that type of granular control with a straight-up Spring Timer.

Meet Quartz, a full-featured, open source job scheduling service that can be integrated with, or used along side virtually any Java EE or Java SE application.  Similar to a native UNIX Cron job, Quartz lets you define powerful CronExpression's that give you very precise control over when a job or task is started and on what interval.

Setting up Quartz with your Spring powered web-application is easy.

1 - Download Quartz

The latest Quartz libraries are available here.  Download them, and add to your build-path and build-files accordingly.


2 - Add Beans to Your applicationContext.xml

In your applicationContext.xml, add the necessary beans:

<!-- this is the bean we're going to run on a schedule
with Quartz; we'll call it UpdaterOnScheduleExecutor.
The class is com.kolich.app.beans.UpdaterBean -->
<bean id="UpdaterOnScheduleExecutor"
class="com.kolich.app.beans.UpdaterBean"
init-method="init"
depends-on="AnotherBean">
<property name="someProperty" value="/WEB-INF/something" />
</bean>

<!-- quartz stuff below -->

<!-- UpdaterOnScheduleJobDetail defines a bean that points to
UpdaterOnScheduleExecutor and says to call its execute()
method when the trigger is fired -->
<bean id="UpdaterOnScheduleJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="UpdaterOnScheduleExecutor"/>
<!-- the method to call inside of
com.kolich.app.beans.UpdaterBean -->
<property name="targetMethod" value="execute"/>
</bean>

<!-- here's where we use the Cron like scheduling expression
to define when the bean is run. -->
<bean id="UpdaterOnScheduleJob"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="UpdaterOnScheduleJobDetail" />
<!-- run every morning at 3AM -->
<property name="cronExpression" value="0 0 3 * * ?" />
</bean>

<!-- the scheduler factory is what does the work to setup
the triggers -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="UpdaterOnScheduleJob" />
</list>
</property>
</bean>

Note that you can add as many jobs/triggers as desired to the Quartz SchedulerFactoryBean.


3 - Sample Cron Expressions

Here are some other sample cronExpression's you might enjoy (I borrowed these from the Quartz trigger tutorial) ...

Fires every five minutes:

"0 0/5 * * * ?"

Fires every 5 minutes, at 10 seconds after the minute:

"10 0/5 * * * ?"

Fires at 10:30, 11:30, 12:30, and 13:30, on every Wednesday and Friday:

"0 30 10-13 ? * WED,FRI"

Fires every half hour between the hours of 8 am and 10 am on the 5th and 20th of every month:

"0 0/30 8-9 5,20 * ?"

Enjoy!

Did You Find this Helpful?

Did you find this post helpful, or at least, interesting?

  

About Mark

A Silicon Valley native, Mark Kolich is a full-time Software Engineer and a consultant for hire. A web technologies expert, his current focus is on building powerful and robust cloud-driven web-applications using Java, PHP, Perl, AJAX, DHTML, CSS, and JavaScript. His favorite programming languages are PHP, Java and JavaScript. He uses Linux, enjoys biking to work, loves building great software, and always writes elegant, readable, and maintainable code.

No TrackBacks

No trackbacks attached to this entry.

Twitter (@markkolich)

Translate

About this Entry

This page contains a single entry by Mark Kolich published on March 27, 2010 10:25 AM.

Fixing Blown Thermal Fuse in Krups KM7000 Coffee Maker; Triangle Head/Bit Tamper Proof Screws Too! was the previous entry in this blog.

HOWTO: Ignore Files and Directories in Subversion (SVN) is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.