【常见错误】Quartz常见错误
1.集群之后把其中一个Quartz服务停了,其他的也不接手工作
问题描述
集群之后,A节点执行了大多数任务,B节点大部分时间处于空闲,停掉A节点,B节点也不会接手工作。
解决方式
修改Quartz的配置,将每个节点的org.quartz.scheduler.instanceId设置为不同的值,或者都设置为AUTO。另外org.quartz.jobStore.isClustered属性必须设为true,org.quartz.jobStore.clusterCheckinInterval属性为集群中每次检查的时间间隔(按我的理解,应该差不多等于一个服务器挂了之后,其他服务器接手的时间),单位为毫秒,默认值是15000。
2.在Spring中使用Quartz的高级配置
问题描述
Quartz集群仅能使用JDBC JobStore工作,需要在Spring中使用Quartz的高级配置
解决方式
1 通过SchedulerFactoryBean的configLocation属性指定Quartz配置文件的位置。
<bean id="quartzJobFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="clusterTesterJobScheduledTask" />
</list>
</property>
<property name="configLocation" value="classpath:quartz.properties" />
</bean>
2 通过SchedulerFactoryBean的quartzProperties属性直接配置
3.NotSerializableException
问题描述
在将Quartz的Job持久化到数据库的过程中产生NotSerializableException。详细异常信息为:
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
解决方式
将任务class MethodInvokingJobDetailFactoryBean 替换为 JobDetailFactoryBean
<!-- 任务 -->
<bean id="oaBranchDataCacheJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="group" value="ETC_REST_GROUP" />
<property name="name" value="OaBranchDataCacheJob" />
<!-- 没有绑定触发器仍然保留在Quartz的JobStore中 -->
<!-- <property name="Durability" value="true"/> -->
<property name="jobClass" value="com.c2vm.xia.rest.quartz.job.OaBranchDataCacheJob" />
</bean>
<!-- 调度触发器 -->
<bean id="oaBranchDataCacheJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="group" value="ETC_REST_GROUP" />
<property name="name" value="OaBranchDataCacheJob_trigger" />
<property name="jobDetail" ref="oaBranchDataCacheJob" />
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
并修改任务Java类继承QuartzJobBean
import org.apache.log4j.Logger;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class OaBranchDataCacheJob extends QuartzJobBean {
private Logger logger = Logger.getLogger(OaBranchDataCacheJob.class);
public OaBranchDataCacheJob() {
logger.info("OaBranchDataCacheJob init ..");
}
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
System.out.println("=======【OaBranchDataCacheJob】");
}
}
4.持久化时jobDetail找不到
问题描述
错误信息如下:
org.quartz.JobPersistenceException: The job (DEFAULT.studyDetail) referenced by the trigger does not exist.
解决方式
原因一般是数据源配置导致的问题。
可能的原因是:数据源未配置成自动提交,当第一次启动trigger时,之前对数据库的job的增加的事物没有自动提交,导致后面的事物无法查询到。
如果数据源是通过dbcp配置的将自动提交配置为true
<property name="defaultAutoCommit" value="false" />
如果是c3p0配置为
autoCommitOnClose=true
5.错误Jobs added with no trigger must be durable
问题描述
启动时报错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'schedulerFactoryBean' defined in ServletContext resource [/WEB-INF/conf/spring-quartz.xml]: Invocation of init method failed; nested exception is org.quartz.SchedulerException: Jobs added with no trigger must be durable.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1512)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:296)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:610)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4738)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5181)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: org.quartz.SchedulerException: Jobs added with no trigger must be durable.
at org.quartz.core.QuartzScheduler.addJob(QuartzScheduler.java:934)
at org.quartz.core.QuartzScheduler.addJob(QuartzScheduler.java:927)
at org.quartz.impl.StdScheduler.addJob(StdScheduler.java:268)
at org.springframework.scheduling.quartz.SchedulerAccessor.addJobToScheduler(SchedulerAccessor.java:344)
at org.springframework.scheduling.quartz.SchedulerAccessor.addTriggerToScheduler(SchedulerAccessor.java:367)
at org.springframework.scheduling.quartz.SchedulerAccessor.registerJobsAndTriggers(SchedulerAccessor.java:305)
at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:508)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1571)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1509)
... 21 more
解决方式
在配置文件中的jobDetail bean配置里增加配置

<!-- 没有绑定触发器仍然保留在Quartz的JobStore中 --> <property name="Durability" value="true"/>
6.JobStoreCMT发生死锁
解决方式
1.当tx需要很长的时间时,某些数据库可能会误报死锁,可以加索引
// 创建单列索引
在qrtz_triggers(NEXT_FIRE_TIME)上创建索引idx_qrtz_t_next_fire_time;
在qrtz_triggers(TRIGGER_STATE)上创建索引idx_qrtz_t_state;
在qrtz_triggers(TRIGGER_STATE,NEXT_FIRE_TIME)上创建索引idx_qrtz_t_nf_st;
在qrtz_fired_triggers(TRIGGER_NAME)上创建索引idx_qrtz_ft_trig_name;
在qrtz_fired_triggers(TRIGGER_GROUP)上创建索引idx_qrtz_ft_trig_group;
在qrtz_fired_triggers(TRIGGER_NAME)上创建索引idx_qrtz_ft_trig_name;
在qrtz_fired_triggers(INSTANCE_NAME)上创建索引idx_qrtz_ft_trig_inst_name;
在qrtz_fired_triggers(JOB_NAME)上创建索引idx_qrtz_ft_job_name;
在qrtz_fired_triggers(JOB_GROUP)上创建索引idx_qrtz_ft_job_group;
// 创建联合索引
创建索引idx_qrtz_ft_trig_n_g on \
qrtz_fired_triggers(TRIGGER_NAME,TRIGGER_GROUP);
创建索引idx_qrtz_t_next_fire_time_misfire on \
qrtz_triggers(MISFIRE_INSTR,NEXT_FIRE_TIME);
创建索引idx_qrtz_t_nf_st_misfire on \
qrtz_triggers(MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_STATE);
创建索引idx_qrtz_t_nf_st_misfire_grp on \
qrtz_triggers(MISFIRE_INSTR,NEXT_FIRE_TIME,TRIGGER_GROUP,TRIGGER_STATE);
2.检查数据源中是否有线程池连接数量+2个连接,只能多不能少
3.确保你有一个为Quartz配置的托管和非托管数据源
4.确保您使用调度程序接口完成的所有工作都是在事务中完成的。通过在SessionBean中使用调度程序来完成此操作,该调用程序的tx设置为“Required”和“Container”。或者在具有类似设置的MessageDrivenBean中。最后,自己启动一个UserTransaction,并在完成后提交工作。
5.如果任务的execute()方法使用调度程序,请通过使用UserTransaction或通过设置Quartz config属性“org.quartz.scheduler.wrapJobExecutionInUserTransaction = true”确保事务正在进行中。
7.quartz.properties配置filename
应该是
org.quartz.plugin.jobInitializer.fileNames = my_quartz_jobs.xml
而不是
org.quartz.plugin.jobInitializer.fileName = my_quartz_jobs.xml
这个应该和quartz的jar包版本有关,具体哪个版本使用哪个么有研究。否则会报错
Exception in thread "main" org.quartz.SchedulerException: JobStore SchedulerPlugin 'org.quartz.plugins.xml.JobInitializationPlugin' props could not be configured. [See nested exception: java.lang.NoSuchMethodException: No setter for property 'fileName'] at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:) at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:) at org.quartz.impl.StdSchedulerFactory.getDefaultScheduler(StdSchedulerFactory.java:) at com.gyb.JobScheduler.startScheduler(JobScheduler.java:) at com.gyb.JobScheduler.main(JobScheduler.java:) Caused by: java.lang.NoSuchMethodException: No setter for property 'fileName' at org.quartz.impl.StdSchedulerFactory.setBeanProps(StdSchedulerFactory.java:) at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:) ... more
8.应用服务器启动状态下,当对任务进行了修改时(即修改了job.xml中的任务明细),Quartz无法响应这种变化.也就是说,Quartz并没有进行"有状态"作业!
无论是修改了任务明细中的参数列表--JobDataMap,或是CronExpression中的定时表达式,都应该立即做出响应,并按照新的配置参数去执行这个任务.
解决方式
在quartz.properties中加入下面两行配置即可:
#自动扫描任务单并发现改动的时间间隔,单位为秒 org.quartz.plugin.jobInitializer.scanInterval #覆盖任务调度器中同名的jobDetail,避免只修改了CronExpression所造成的不能重新生效情况 org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
9.任务被删除后,数据库不会减少任务
解决方式
可以考虑在JobDataMap中增加是否执行的配置项,即使任务会执行,但根据这种配置项,仍然可以拒绝下一步的操作.当然了,修改CronExpression使之成为一个永远不会执行到的时间也是一个办法.
或者在数据库中物理删除
【常见错误】Quartz常见错误的更多相关文章
- mysql 常见的几个错误问题
Mysql常见的几个错误问题及解决方法: 1.问题: mysql DNS反解:skip-name-resolve 错误日志有类似警告: 点击(此处)折叠或打开 120119 16:26:04 [War ...
- Java 中最常见的 5 个错误
在编程时,开发者经常会遭遇各式各样莫名错误.近日,Sushil Das 在 Geek On Java上列举了 Java 开发中常见的 5 个错误,与君共「免」. 原文链接:Top 5 Common M ...
- SEO中最常见的几个错误
昨天答应给放点干活的,今天如约而来! SEO中最常见的几个错误: 1.关键词 人们往往想当然的选择自己喜欢的keyword,但用户在搜索时,根本不会使用它们.比方说,你选择"优化果酱&q ...
- Oracle优化网上常见的5个错误观点
最近系统的研究了一下ORACLE SQL语句性能调优,在此大言不惭的得出一个观点——网上很多性能调优的结论都是错误的或者不周全的.现在的DBA大牛些都太低调了,不出来斧正一下,小弟来借这个机会吐槽一下 ...
- 常见C语言编译错误解析【转】
C语言编译错误信息及说明1. 在函数 ‘transform’ 中:7: 错误:expected ‘;’ before ‘{’ token 解释:‘{’之前的某个语句缺少分号‘;’: 2. 在函数 ...
- 常见反编译产生错误 k__BackingField 解决办法
常见反编译产生错误 k__BackingField 解决办法 无聊反编译小蚂蚁出现上千的错同样的错 private bool <EnableRuntimeHandler> ...
- adb使用过程常见的几种错误总结
问题1:Failure [INSTALL_FAILED_ALREADY_EXISTS] 问题原因:该程序已存在. 解决方法:增加-r参数,即可成功覆盖安装 问题2:Failure [INSTALL_F ...
- http常见的5个错误
1. HTTP 500错误(内部服务器错误)对对HTTP 500错误的定义已经充分证明了这是一个最常见的HTTP错误. 一般来说,HTTP 500 错误就是web服务器发生内部错误时返回的信息. 例如 ...
- A query was run and no Result Maps were found for...原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误
今天遇到一个问题,原来是mapper.xml文件出了问题,是使用MyBatis最常见的一种错误 报错的结果是这样的: A query was run and no Result Maps were f ...
- 5种常见的Docker Compose错误
在构建一个容器化应用程序时,开发人员需要一种方法来引导他们正在使用的容器去测试其代码.虽然有几种方法可以做到这一点,但 Docker Compose 是最流行的选择之一.它让你可以轻松指定开发期间要引 ...
随机推荐
- 15、js 原生基础总结
Day1 一.什么是JS? ==基于对象==和==事件驱动==的客户端脚本语言 二.哪一年?哪个公司?谁?第一个名字是什么? 1995,NetScape(网景公司),布兰登(Brendan Eic ...
- bash shell执行方式
五种bash shell执行方式 fork, source, exec, (), {} Shell脚本的执行方式: 注明:wd代表“脚本保存的目录” 1.fork语法:/wd/shell.shfork ...
- Linux命令行下快捷键
快捷键 说明 Ctrl+a 切换到命令行开始 Ctrl+e 切换到命令行末尾 Ctrl+c 终止当前命令或脚本 Ctrl+d ①退出当前shell,相当于exit②一个个删除光标后字符 Ctrl+l ...
- juqery 给本身的class加上一个class 或也可以实现关注商品,取消关注商品
$("#goods1").on("click",".ICON-fen-LOVE",function(){ var $this = $(thi ...
- MySQL数据查询
数据查询语言DQL select [all | distinct] 字段或表达式列表 [from子句] [where子句] [group by子句] [having子句] [order by子句] [ ...
- python全栈开发 * 30知识点汇总 * 180713
30 re模块2一.正则表达式在线测试 在线测试工具 http://tool.chinaz.com/regex/(一).*?的用法: . 是任意字符 * 是取 0 至 无限长度 ? 是非贪婪模式.合在 ...
- java+js实现展示本地文件夹下的所有图片demo[申明:来源于网络]
java+js实现展示本地文件夹下的所有图片demo[申明:来源于网络] 地址:http://blog.csdn.net/allgis/article/details/46364875
- 洛谷试炼场 - 关卡2-1 - 简单的模拟 - (Done)
最近这段时间感冒外加一些乱七八糟的事情,导致脑子严重僵化……只好刷刷基础(水)题巩固巩固基础(混混题数). 目录 P1003 铺地毯 P1067 多项式输出 P1540 机器翻译 P1056 排座椅 ...
- webstorm项目的structure
https://www.jetbrains.com/help/webstorm/2016.1/symbols.html
- 对象的创建与OOP-Klass模型
1.JVM中OOP-KLASS模型 在JVM中,使用了OOP-KLASS模型来表示java对象,即:1.jvm在加载class时,会创建instanceKlass,表示其元数据,包括常量池.字段.方法 ...