spring-context-support

org.springframework.scheduling.quartz
Class MethodInvokingJobDetailFactoryBean

java.lang.Object
  extended by org.springframework.util.MethodInvoker
      extended by org.springframework.beans.support.ArgumentConvertingMethodInvoker
          extended by org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
All Implemented Interfaces:
org.springframework.beans.factory.Aware, org.springframework.beans.factory.BeanClassLoaderAware, org.springframework.beans.factory.BeanFactoryAware, org.springframework.beans.factory.BeanNameAware, org.springframework.beans.factory.FactoryBean<org.quartz.JobDetail>, org.springframework.beans.factory.InitializingBean

public class MethodInvokingJobDetailFactoryBean
extends org.springframework.beans.support.ArgumentConvertingMethodInvoker
implements org.springframework.beans.factory.FactoryBean<org.quartz.JobDetail>, org.springframework.beans.factory.BeanNameAware, org.springframework.beans.factory.BeanClassLoaderAware, org.springframework.beans.factory.BeanFactoryAware, org.springframework.beans.factory.InitializingBean

FactoryBean that exposes a JobDetail object which delegates job execution to a specified (static or non-static) method. Avoids the need for implementing a one-line Quartz Job that just invokes an existing service method on a Spring-managed target bean.

Inherits common configuration properties from the MethodInvoker base class, such as "targetObject" and "targetMethod", adding support for lookup of the target bean by name through the "targetBeanName" property (as alternative to specifying a "targetObject" directly, allowing for non-singleton target objects).

Supports both concurrently running jobs and non-currently running jobs through the "concurrent" property. Jobs created by this MethodInvokingJobDetailFactoryBean are by default volatile and durable (according to Quartz terminology).

NOTE: JobDetails created via this FactoryBean are not serializable and thus not suitable for persistent job stores. You need to implement your own Quartz Job as a thin wrapper for each case where you want a persistent job to delegate to a specific service method.

Compatible with Quartz 1.5+ as well as Quartz 2.0/2.1, as of Spring 3.1.

Since:
18.02.2004
Author:
Juergen Hoeller, Alef Arendsen
See Also:
setTargetBeanName(java.lang.String), MethodInvoker.setTargetObject(java.lang.Object), MethodInvoker.setTargetMethod(java.lang.String), setConcurrent(boolean)

Nested Class Summary
static class MethodInvokingJobDetailFactoryBean.MethodInvokingJob
          Quartz Job implementation that invokes a specified method.
static class MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJob
          Extension of the MethodInvokingJob, implementing the StatefulJob interface.
 
Constructor Summary
MethodInvokingJobDetailFactoryBean()
           
 
Method Summary
 void afterPropertiesSet()
           
 org.quartz.JobDetail getObject()
           
 java.lang.Class<? extends org.quartz.JobDetail> getObjectType()
           
 java.lang.Class getTargetClass()
          Overridden to support the "targetBeanName" feature.
 java.lang.Object getTargetObject()
          Overridden to support the "targetBeanName" feature.
 boolean isSingleton()
           
protected  void postProcessJobDetail(org.quartz.JobDetail jobDetail)
          Callback for post-processing the JobDetail to be exposed by this FactoryBean.
protected  java.lang.Class resolveClassName(java.lang.String className)
           
 void setBeanClassLoader(java.lang.ClassLoader classLoader)
           
 void setBeanFactory(org.springframework.beans.factory.BeanFactory beanFactory)
           
 void setBeanName(java.lang.String beanName)
           
 void setConcurrent(boolean concurrent)
          Specify whether or not multiple jobs should be run in a concurrent fashion.
 void setGroup(java.lang.String group)
          Set the group of the job.
 void setJobListenerNames(java.lang.String[] names)
          Set a list of JobListener names for this job, referring to non-global JobListeners registered with the Scheduler.
 void setName(java.lang.String name)
          Set the name of the job.
 void setTargetBeanName(java.lang.String targetBeanName)
          Set the name of the target bean in the Spring BeanFactory.
 
Methods inherited from class org.springframework.beans.support.ArgumentConvertingMethodInvoker
doFindMatchingMethod, findMatchingMethod, getDefaultTypeConverter, getTypeConverter, registerCustomEditor, setTypeConverter
 
Methods inherited from class org.springframework.util.MethodInvoker
getArguments, getPreparedMethod, getTargetMethod, getTypeDifferenceWeight, invoke, isPrepared, prepare, setArguments, setStaticMethod, setTargetClass, setTargetMethod, setTargetObject
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

MethodInvokingJobDetailFactoryBean

public MethodInvokingJobDetailFactoryBean()
Method Detail

setName

public void setName(java.lang.String name)
Set the name of the job.

Default is the bean name of this FactoryBean.

See Also:
JobDetail.setName(java.lang.String)

setGroup

public void setGroup(java.lang.String group)
Set the group of the job.

Default is the default group of the Scheduler.

See Also:
JobDetail.setGroup(java.lang.String), Scheduler.DEFAULT_GROUP

setConcurrent

public void setConcurrent(boolean concurrent)
Specify whether or not multiple jobs should be run in a concurrent fashion. The behavior when one does not want concurrent jobs to be executed is realized through adding the StatefulJob interface. More information on stateful versus stateless jobs can be found here.

The default setting is to run jobs concurrently.


setTargetBeanName

public void setTargetBeanName(java.lang.String targetBeanName)
Set the name of the target bean in the Spring BeanFactory.

This is an alternative to specifying "targetObject", allowing for non-singleton beans to be invoked. Note that specified "targetObject" and "targetClass" values will override the corresponding effect of this "targetBeanName" setting (i.e. statically pre-define the bean type or even the bean object).


setJobListenerNames

public void setJobListenerNames(java.lang.String[] names)
Set a list of JobListener names for this job, referring to non-global JobListeners registered with the Scheduler.

A JobListener name always refers to the name returned by the JobListener implementation.

See Also:
SchedulerAccessor.setJobListeners(org.quartz.JobListener[]), JobListener.getName()

setBeanName

public void setBeanName(java.lang.String beanName)
Specified by:
setBeanName in interface org.springframework.beans.factory.BeanNameAware

setBeanClassLoader

public void setBeanClassLoader(java.lang.ClassLoader classLoader)
Specified by:
setBeanClassLoader in interface org.springframework.beans.factory.BeanClassLoaderAware

setBeanFactory

public void setBeanFactory(org.springframework.beans.factory.BeanFactory beanFactory)
Specified by:
setBeanFactory in interface org.springframework.beans.factory.BeanFactoryAware

resolveClassName

protected java.lang.Class resolveClassName(java.lang.String className)
                                    throws java.lang.ClassNotFoundException
Overrides:
resolveClassName in class org.springframework.util.MethodInvoker
Throws:
java.lang.ClassNotFoundException

afterPropertiesSet

public void afterPropertiesSet()
                        throws java.lang.ClassNotFoundException,
                               java.lang.NoSuchMethodException
Specified by:
afterPropertiesSet in interface org.springframework.beans.factory.InitializingBean
Throws:
java.lang.ClassNotFoundException
java.lang.NoSuchMethodException

postProcessJobDetail

protected void postProcessJobDetail(org.quartz.JobDetail jobDetail)
Callback for post-processing the JobDetail to be exposed by this FactoryBean.

The default implementation is empty. Can be overridden in subclasses.

Parameters:
jobDetail - the JobDetail prepared by this FactoryBean

getTargetClass

public java.lang.Class getTargetClass()
Overridden to support the "targetBeanName" feature.

Overrides:
getTargetClass in class org.springframework.util.MethodInvoker

getTargetObject

public java.lang.Object getTargetObject()
Overridden to support the "targetBeanName" feature.

Overrides:
getTargetObject in class org.springframework.util.MethodInvoker

getObject

public org.quartz.JobDetail getObject()
Specified by:
getObject in interface org.springframework.beans.factory.FactoryBean<org.quartz.JobDetail>

getObjectType

public java.lang.Class<? extends org.quartz.JobDetail> getObjectType()
Specified by:
getObjectType in interface org.springframework.beans.factory.FactoryBean<org.quartz.JobDetail>

isSingleton

public boolean isSingleton()
Specified by:
isSingleton in interface org.springframework.beans.factory.FactoryBean<org.quartz.JobDetail>

spring-context-support