Spring’s reference documentation goes over in detail on integrating Quartz with Spring. However, the technique requires extending Spring’s QuartzJobBean class. Here are steps for achieving the same integration with out dependencies on QuartzJobBean class:
Step 1: Create the Quartz job that needs to be scheduled. Here is a simple Hello world job class:
public class HelloWorldJob implements Job
{
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException
{
System.out.println("Hello World");
}
}
Notice that we are simply implementing org.quartz.Job interface.
Step 2: In the Spring’s context file, define a JobDetail bean for this job. A JobDetail contains metadata for the job such as the group a job would belong to etc.
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=”http://www.springframework.org/schema/beans” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xmlns:p=”http://www.springframework.org/schema/p” xmlns:context=”http://www.springframework.org/schema/context”
xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd“>
<bean id=”helloWorldJobDetail” class=”org.quartz.JobDetail”>
<property name=”name” value=”helloWorldJobDetail” />
<property name=”jobClass” value=”local.quartz.job.HelloWorldJob” />
</bean>
Step 3: Again, in the context file, define a Trigger that would trigger the job execution. For simplicity sake, lets use a SimpleTrigger. More about triggers can be found in the Quartz documentation:
<bean id=”simpleTrigger” class=”org.quartz.SimpleTrigger”>
<property name=”name” value=”simpleTrigger” />
<property name=”jobName” value=”helloWorldJobDetail” />
<property name=”startTime”>
<bean class=”java.util.Date” />
</property>
</bean>
The startTime property is set to “now” which means that the job will run as soon as the spring completes bean loading.
Step 4: Finally, define a SchedulerFactoryBean that sets up the Quartz scheduler:
<bean class=”org.springframework.scheduling.quartz.SchedulerFactoryBean”>
<property name=”jobDetails”>
<list> <ref bean=”helloWorldJobDetail” /> </list>
</property>
<property name=”triggers”>
<list> <ref bean=”simpleTrigger” /> </list>
</property>
</bean>
Notice that this is the only Spring class used in the configuration. When the application loads the Spring context, the job should run and print “Hello World”
In most cases, the job instances rely on external services to perform their job (such as an email service to send out email). These external components can be easily made available to the job instances via dependency injection. Let’s modify the above class to display a custom message:
public class HelloWorldJob implements Job
{
private String message;
public void setMessage(String message)
{
this.message = message;
}
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException
{
System.out.println(message);
}
}
Next, in the Spring context file, add a bean that contains the custom message we want to display:
<bean id=”message” class=”java.lang.String”>
<constructor-arg value=”Hello Again!!” />
</bean>
With Quartz 1.5 and above, dependency Injection into Quartz jobs can be done via a JobFactory instance. Here are the modifications that need to be done to the Spring context:
<bean id=”jobFactory” class=”org.springframework.scheduling.quartz.SpringBeanJobFactory” />
<bean class=”org.springframework.scheduling.quartz.SchedulerFactoryBean”>
<property name=”jobFactory” ref=”jobFactory” />
<property name=”schedulerContextAsMap”>
<map> <entry key=”message” value-ref=”message” /> </map>
</property>
<property name=”jobDetails”>
<list> <ref bean=”helloWorldJobDetail” /> </list>
</property>
<property name=”triggers”>
<list> <ref bean=”simpleTrigger” /> </list>
</property>
</bean>
Now when the Spring context gets loaded, the job should run and print “Hello Again!!”.