Package org.springframework.scheduling.quartz

# Class MethodInvokingJobDetailFactoryBean

java.lang.Object
org.springframework.util.MethodInvoker
org.springframework.beans.support.ArgumentConvertingMethodInvoker
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<JobDetail>`, `org.springframework.beans.factory.InitializingBean`

public class MethodInvokingJobDetailFactoryBean extends org.springframework.beans.support.ArgumentConvertingMethodInvoker implements org.springframework.beans.factory.FactoryBean<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 2.1.4 and higher, as of Spring 4.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

Nested Classes
Modifier and Type
Class
Description
`static class`
`MethodInvokingJobDetailFactoryBean.MethodInvokingJob`
Quartz Job implementation that invokes a specified method.
`static class`
`MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJob`
Extension of the MethodInvokingJob, implementing the StatefulJob interface.

## Field Summary

### Fields inherited from class org.springframework.util.MethodInvoker

`targetClass`

### Fields inherited from interface org.springframework.beans.factory.FactoryBean

`OBJECT_TYPE_ATTRIBUTE`

## Constructor Summary

Constructors
Constructor
Description
`MethodInvokingJobDetailFactoryBean()`

## Method Summary

Modifier and Type
Method
Description
`void`
`afterPropertiesSet()`
`JobDetail`
`getObject()`
`Class<? extends JobDetail>`
`getObjectType()`
`Class<?>`
`getTargetClass()`
Overridden to support the `"targetBeanName"` feature.
`Object`
`getTargetObject()`
Overridden to support the `"targetBeanName"` feature.
`boolean`
`isSingleton()`
`protected void`
`postProcessJobDetail(JobDetail jobDetail)`
Callback for post-processing the JobDetail to be exposed by this FactoryBean.
`protected Class<?>`
`resolveClassName(String className)`
`void`
`setBeanClassLoader(ClassLoader classLoader)`
`void`
`setBeanFactory(org.springframework.beans.factory.BeanFactory beanFactory)`
`void`
`setBeanName(String beanName)`
`void`
`setConcurrent(boolean concurrent)`
Specify whether multiple jobs should be run in a concurrent fashion.
`void`
`setGroup(String group)`
Set the group of the job.
`void`
`setName(String name)`
Set the name of the job.
`void`
`setTargetBeanName(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 Details

### MethodInvokingJobDetailFactoryBean

public MethodInvokingJobDetailFactoryBean()

## Method Details

### setName

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

Default is the bean name of this FactoryBean.

### setGroup

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

Default is the default group of the Scheduler.

See Also:
  - `Scheduler.DEFAULT_GROUP`

### setConcurrent

public void setConcurrent(boolean concurrent)
Specify whether 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 `@PersistJobDataAfterExecution` and `@DisallowConcurrentExecution` markers. More information on stateful versus stateless jobs can be found here.

The default setting is to run jobs concurrently.

### setTargetBeanName

public void setTargetBeanName(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).

### setBeanName

public void setBeanName(String beanName)

Specified by:
  `setBeanName` in interface `org.springframework.beans.factory.BeanNameAware`

### setBeanClassLoader

public void setBeanClassLoader(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 Class<?> resolveClassName(String className) throws ClassNotFoundException

Overrides:
  `resolveClassName` in class `org.springframework.util.MethodInvoker`
Throws:
  `ClassNotFoundException`

### afterPropertiesSet

public void afterPropertiesSet() throws ClassNotFoundException, NoSuchMethodException

Specified by:
  `afterPropertiesSet` in interface `org.springframework.beans.factory.InitializingBean`
Throws:
  `ClassNotFoundException`
  `NoSuchMethodException`

### postProcessJobDetail

protected void postProcessJobDetail(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

@Nullable public Class<?> getTargetClass()
Overridden to support the `"targetBeanName"` feature.

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

### getTargetObject

@Nullable public Object getTargetObject()
Overridden to support the `"targetBeanName"` feature.

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

### getObject

@Nullable public JobDetail getObject()

Specified by:
  `getObject` in interface `org.springframework.beans.factory.FactoryBean<JobDetail>`

### getObjectType

public Class<? extends JobDetail> getObjectType()

Specified by:
  `getObjectType` in interface `org.springframework.beans.factory.FactoryBean<JobDetail>`

### isSingleton

public boolean isSingleton()

Specified by:
  `isSingleton` in interface `org.springframework.beans.factory.FactoryBean<JobDetail>`