Using Memory to Store Scheduler Information

Table of contents:

Out of the box, Quartz is configured to store job and trigger information in memory. This explains why, for the examples in the past several chapters, every time we restarted the Quartz application, the Scheduler state, including job and trigger information, was lost. Each time the Java Virtual Machine (JVM) is halted, its memory is released back to the operating system, and any information about jobs and triggers is lost with it.

The memory job storage facility for Quartz is provided by a class called org.quartz.simpl.RAMJobStore, which, as we said, implements the JobStore interface. The RAMJobStore is the out-of-the-box solution for Quartz. By this, we mean that unless you change the configuration, this is the JobStore that will be used for any Quartz application. Using this JobStore over the others brings several advantages.

First, the RAMJobStore is the easiest JobStore to configure: It's already configured for you. When you download and install Quartz, it's configured to use the RAMJobStore as the storage mechanism. You can see this in the default file, shown in Listing 6.1.

Listing 6.1. Default File When No Other Is Configured

# Default Properties file for use by StdSchedulerFactory
# to create a Quartz Scheduler Instance, if a different
# properties file is not explicitly specified.

org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

org.quartz.jobStore.misfireThreshold = 60000

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

Listing 6.1 shows the default file that is included with the Quartz binary. When you don't include a file of your own in your application, this is the properties file that gets used. You can see from the last line in the default file that the RAMJobStore is the default value for the configuration property named org.quartz.jobstore.class. Even if the org.quartz.jobstore.class property is not set in, the RAMJobStore is the default JobStore that is used. This is hardwired into the Scheduler factory initialization routine.

Another advantage to using the RAMJobStore is its speed. Because all the Scheduler information is stored in the computer's memory, accessing this data is as fast as it gets. There are no out-of-process calls, no database connectionsjust plain old simple memory access. It doesn't get any better.

Job Volatility with RAMJobStore

You might remember from Chapter 4, "Scheduling Jobs," that jobs can be configured with a volatility property. When the volatility property is set to false, the job will be persisted between application shutdowns. This is not true when the RAMJobStore is being used; that behavior is explicitly reserved for persistent JobStores.

Configuring the RAMJobStore

Configuring your Quartz application to use the RAMJobStore is extremely easy. If you are using a custom file, not the one that comes with the Quartz JAR file, add this line to your properties file:

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

That's all you have to do to use the RAMJobStore. As we said, it doesn't get any easier.

Loading Jobs into the RAMJobStore

If the purpose of the RAMJobStore is to store Scheduler information, how does that information get loaded into memory in the first place? You can load job information in two ways. First, you can hardcode your jobs, triggers, calendars, and listeners into the code itself. As Chapters 3, "Hello, Quartz," and 4, "Scheduling Jobs," pointed out, however, this is always a dangerous thing to do because maintenance can become a nightmare. Any change, regardless of how trivial it is, requires a code change and recompile. Even if the change is a change to the firing times, code has to be modified and recompiled. Not a big deal, you say? That might be true for small, trivial applications, but this can become a real problem for larger numbers of jobs and triggers.

The second approach is to use the JobInitializationPlugin, which is discussed in detail in Chapter 8, "Using Quartz Plug-Ins." This Quartz plug-in uses an XML file to load jobs, triggers, calendars, and everything else that you need to load. The advantage to this approach is that a change requires a simple change to the XML fileno code changes, no recompilation, just a text editor. Read Chapter 8 for more information on Quartz plug-ins.

Disadvantage to RAMJobStore

"The RAMJobStore can't be all positive, right?" you ask. Well, that's true. We mentioned several of the advantages of using a RAMJobStore. Now let's talk about the one big negative: Because a computer's memory is volatile, when your Quartz application is stopped, it releases the memory back to the operating system. Of course, along with everything else stored in that released memory is the scheduling information.

If your application requires Scheduler information to be maintained between application restarts, you need to take a look at persistent JobStores.

Using Persistent JobStores

Scheduling in the Enterprise

Getting Started with Quartz

Hello, Quartz

Scheduling Jobs

Cron Triggers and More

JobStores and Persistence

Implementing Quartz Listeners

Using Quartz Plug-Ins

Using Quartz Remotely

Using Quartz with J2EE

Clustering Quartz

Quartz Cookbook

Quartz and Web Applications

Using Quartz with Workflow

Appendix A. Quartz Configuration Reference

Quartz Job Scheduling Framework(c) Building Open Source Enterprise Applications
Quartz Job Scheduling Framework: Building Open Source Enterprise Applications
ISBN: 0131886703
EAN: 2147483647
Year: N/A
Pages: 148 © 2008-2020.
If you may any questions please contact us: