Quartz job Cluster下报错

本文介绍在Cluster环境下配置Quartzjob为集群模式的方法,并针对配置过程中出现的NotSerializableException异常提供解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Cluster环境下,配置Quartz job为集群模式后,配置示例如下,其中红色部分与集群模式相关。我使用的是quartz-all-1.6.0,spring-context-support-3.0.1。

 1     <bean id="startQuertz" lazy-init="false" autowire="no"
 2         class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 3         <property name="triggers">
 4             <list>
 5                 <ref bean="jobTrigger" />
 6             </list>
 7         </property>
 8         <property name="dataSource" ref="dataSource" />
 9         <property name="transactionManager" ref="transactionManager" />
10         <property name="quartzProperties">
11             <props>
12                 <prop key="org.quartz.scheduler.instanceName">DataScheduler</prop>
13                 <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
14                 <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
15                 <prop key="org.quartz.threadPool.threadCount">5</prop>
16                 <prop key="org.quartz.threadPool.threadPriority">5</prop>
17                 <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
18                 <prop key="org.quartz.jobStore.class">org.springframework.scheduling.quartz.LocalDataSourceJobStore</prop>
19                 <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
20                 <prop key="org.quartz.jobStore.isClustered">true</prop>
21                 <prop key="org.quartz.jobStore.useProperties">false </prop>
22             </props>
23         </property>
24     </bean>

 

但系统运行Quartz job抛出如下的错误信息:

1 Caused by: org.quartz.JobPersistenceException: Couldn't store job: Unable to serialize JobDataMap for insertion into database because the value of property 'methodInvoker' is not serializable: org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean [See nested exception: 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]
 2     at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJob(JobStoreSupport.java:1041)
 3     at org.quartz.impl.jdbcjobstore.JobStoreSupport$4.execute(JobStoreSupport.java:1011)
 4     at org.quartz.impl.jdbcjobstore.JobStoreSupport$39.execute(JobStoreSupport.java:3590)
 5     at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:244)
 6     at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInLock(JobStoreSupport.java:3586)
 7     at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJob(JobStoreSupport.java:1007)
 8     at org.quartz.core.QuartzScheduler.addJob(QuartzScheduler.java:785)
 9     at org.quartz.impl.StdScheduler.addJob(StdScheduler.java:278)
10     at org.springframework.scheduling.quartz.SchedulerAccessor.addJobToScheduler(SchedulerAccessor.java:311)
11     at org.springframework.scheduling.quartz.SchedulerAccessor.addTriggerToScheduler(SchedulerAccessor.java:334)
12     at org.springframework.scheduling.quartz.SchedulerAccessor.registerJobsAndTriggers(SchedulerAccessor.java:271)
13     at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:513)

网上google一番,发现这个是Spring的一个Bug,详情参见:http://forum.springsource.org/showthread.php?31820-Quartz-and-JDBCJobStore,按照论坛中的方案修改Spring包中的2个java文件后解决。

其他的注意事项

1. Quartz job类要实现java.io.Serializable接口,不然还是会报NotSerializableException的异常。

2. Quartz job类的属性也要实现java.io.Serializable接口。

参考

http://soulshard.iteye.com/blog/337886

<think>好的,我需要帮助用户解决Quartz定时任务启动时的报错问题。首先,我应该回顾用户提供的引用内容,看看里面有哪些关键信息。用户提供了四个引用,其中引用[2]提到线程数量不足,引用[3]和[4]涉及Spring Boot与Shiro整合时的上下文问题和热加载配置。 首先,用户的问题是关于启动时的报错,可能涉及配置错误、依赖冲突或上下文问题。根据引用[2],旧版本的Quartz可能无法通过配置文件调整线程数,导致任务堆积。所以需要检查Quartz版本,如果是1.x,可能需要升级到2.x,但用户提到升级后出现兼容性问题。这时候可能需要手动调整线程池配置或寻找其他解决办法。 引用[3]指出在Spring Boot整合Shiro和Quartz时,获取Spring Bean的问题。这提示可能需要使用SpringBeanJobFactory来确保Quartz Job能正确注入Spring管理的Service。如果用户遇到类似问题,可能需要检查Job类是否通过ApplicationContext获取Bean,或者是否配置了合适的JobFactory。 引用[4]提到热加载导致的问题,需要调整热加载配置,比如禁用某些类加载器的设置。此外,堆栈信息中的异常可能涉及类找不到或方法不存在,需要检查依赖版本是否兼容,特别是Spring Boot和Quartz的版本是否匹配。 接下来,我应该将这些点整理成步骤,包括检查异常堆栈、版本兼容性、线程池配置、上下文管理以及热加载设置。同时,要确保回答结构清晰,分步骤说明,并引用相关的引用内容作为支持。此外,生成相关问题时要围绕常见问题展开,比如版本冲突、配置优化、依赖注入等。</think>### Quartz定时任务启动报错解决方案 #### 1. 检查异常堆栈信息 首先需要查看完整的错误日志定位具体报错原因。常见错误类型包括: - **依赖版本冲突**:Spring Boot与Quartz版本不兼容(如Spring Boot 2.1+需配合Quartz 2.3.0+) - **线程池不足**:默认10个执行线程可能导致任务堆积,需调整线程池配置[^2] - **上下文获取失败**:定时任务无法获取Spring管理的Service实例[^3] #### 2. 版本兼容性验证 ```xml <!-- 推荐版本组合 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` 若使用旧版本Quartz(如1.5.2),需在`quartz.xml`中手动配置线程池: ```xml <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="configLocation" value="classpath:quartz.properties"/> <property name="taskExecutor"> <bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="25"/> </bean> </property> </bean> ``` #### 3. 上下文注入解决方案 对于调用Service报错问题,推荐使用`SpringBeanJobFactory`: ```java @Configuration public class QuartzConfig { @Autowired private ApplicationContext applicationContext; @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean factory = new SchedulerFactoryBean(); AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory(); jobFactory.setApplicationContext(applicationContext); factory.setJobFactory(jobFactory); return factory; } } ``` #### 4. 热加载问题处理 若出现`ClassNotFoundException`或方法不存在错误: 1. 在`application.properties`添加: ```properties spring.devtools.restart.enabled=false ``` 2. 检查类加载器配置,确保热加载不会破坏Quartz任务执行环境[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值