与Spring一起使用时出现Quartz持久性作业问题

Ahs*_*hah 5 java spring quartz-scheduler

我已经配置了一个弹簧的方法来调用之前的工作正常工作.现在我的要求是将此作业保持为持久性,这将在集群环境中运行.将quartz配置为集群和持久性后,应用程序在部署时抛出以下异常:

java.io.NotSerializableException:无法序列化JobDataMap以插入数据库,因为属性'methodInvoker'的值不可序列化:org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

我使用以下版本:

  • Spring版本3.1.4.RELEASE
  • Quartz 2.1.7版

更新:根据以下文档MethodInvokingJobDetailFactoryBean:

JobDetails created via this FactoryBean are not serializable.
Run Code Online (Sandbox Code Playgroud)

因此,寻找一些在Spring中配置持久作业的替代方法.

Ahs*_*hah 7

我已经通过更换解决了这个问题MethodInvokingJobDetailFactoryBeanJobDetailFactoryBean.配置如下:

<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>
Run Code Online (Sandbox Code Playgroud)

但是,对于Autowire我的作业类中的spring托管bean,我mypackage.MyJob在execute方法中添加了以下内容作为第一行:

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);
        ...
    }

}
Run Code Online (Sandbox Code Playgroud)

希望它能帮助其他人面对同样的问题.


geo*_*and 6

当您使用持久性石英作业时,您应该将org.quartz.jobStore.useProperties属性设置为true.这会强制将作业数据保存为Strings而不是Java Serialized对象.

但这样做可能会导致Spring出现一些问题,这些问题很容易解决.

查看这些链接了解更多详情:

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

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