Issue
I have configured a spring's method invoking job previously which is working fine. Now my requirement is to have this job as persistent which will run in a clustered environment. After configuring the quartz as clustered and persistence, application is throwing the following exception at deployment:
java.io.NotSerializableException: Unable to serialize JobDataMap for insertion into database because the value of property 'methodInvoker' is not serializable: org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
I am using the following versions:
- Spring version 3.1.4.RELEASE
- Quartz version 2.1.7
Update: As per the documentation of MethodInvokingJobDetailFactoryBean
:
JobDetails created via this FactoryBean are not serializable.
So, looking for some alternative approach to configure a persistent job in spring.
Solution
I have solved the problem by replacing MethodInvokingJobDetailFactoryBean
with JobDetailFactoryBean
. Configuration for the same is as follows:
<bean name="myJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="mypackage.MyJob" />
<property name="group" value="MY_JOBS_GROUP" />
<property name="durability" value="true" />
</bean>
However, to Autowire
the spring managed beans in my job class mypackage.MyJob
, I have added the following as first line in my execute method:
class MyJob implements Job {
...
public void execute(final JobExecutionContext context) throws JobExecutionException {
// Process @Autowired injection for the given target object, based on the current web application context.
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
...
}
}
Hope it it will help someone else facing the same issue.
Answered By - Ahsan Shah
Answer Checked By - Marie Seifert (JavaFixing Admin)