Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issue with Quartz persistent jobs while using with Spring

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.

like image 364
Ahsan Shah Avatar asked May 05 '14 08:05

Ahsan Shah


2 Answers

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.

like image 65
Ahsan Shah Avatar answered Oct 04 '22 21:10

Ahsan Shah


When you are using persistent quartz jobs, you should be setting the org.quartz.jobStore.useProperties property to true. That forces the job data to be saved as Strings instead of Java Serialized objects.

Doing so however may cause some problems with Spring, that are easily solvable.

Check these links for more details:

http://site.trimplement.com/using-spring-and-quartz-with-jobstore-properties/

http://forum.spring.io/forum/spring-projects/container/121806-quartz-error-ioexception

like image 24
geoand Avatar answered Oct 04 '22 19:10

geoand