说来羞愧,这个问题困扰我2年时间,系统要通过UI设置定时任务,定时任务持久化到数据库,保证系统重启后定时任务仍可以执行,当然也需要随时取消定时任务,一旦取消任务,UI被锁住(其实是后台的处理程序被锁住了),需要3-5分钟才能恢复,一般情况下,后台会报数据库的错误。
问题出现后,我反复测试也没办法解决,反正锁住之后,一旦恢复,再操作,处理起来就很快了,先不管了。
去年新人要开发另外的系统,需要相同的组件,当然也就遇到了相同的问题,他也解决不了,因此他改用直接删数据的办法解决,但是工期紧,没太在意。现在我接手升级系统,发现问题依旧,还是绕不开这问题,没办法,按照正规的方法修正这个问题吧,要不不知要流毒多久
1.反复实验多次后,新人的做法无法解决问题,
2.重新改回用API的unscheduleJob和deleteJob处理,无效
3.怀疑是quartz的版本问题,原版本是1.6.0,下载了两个版本1.6.6,1.8.3,1.8.3版本太高,spring不认,换成1.6.6吧,问题依旧
4.没办法,修改log4j的配置文件,搞清quartz的原理再解决吧,日志如下
写道
2010-07-22 13:37:40,796 (http-8888-Processor24) [ DBSemaphore.java:106:DEBUG] Lock 'TRIGGER_ACCESS' is desired by: http-8888-Processor24
2010-07-22 13:37:40,796 (http-8888-Processor24) [ DBSemaphore.java:106:DEBUG] Lock 'TRIGGER_ACCESS' is desired by: http-8888-Processor24
2010-07-22 13:37:40,796 (http-8888-Processor24) [StdRowLockSemaphore.java:89 :DEBUG] Lock 'TRIGGER_ACCESS' is being obtained: http-8888-Processor24
2010-07-22 13:37:40,796 (http-8888-Processor24) [StdRowLockSemaphore.java:89 :DEBUG] Lock 'TRIGGER_ACCESS' is being obtained: http-8888-Processor24
2010-07-22 13:37:40,796 (http-8888-Processor24) [ DBSemaphore.java:115:DEBUG] Lock 'TRIGGER_ACCESS' given to: http-8888-Processor24
2010-07-22 13:37:40,796 (http-8888-Processor24) [ DBSemaphore.java:115:DEBUG] Lock 'TRIGGER_ACCESS' given to: http-8888-Processor24
2010-07-22 13:37:40,828 (http-8888-Processor24) [ DBSemaphore.java:142:DEBUG] Lock 'TRIGGER_ACCESS' returned by: http-8888-Processor24
2010-07-22 13:37:40,828 (http-8888-Processor24) [ DBSemaphore.java:142:DEBUG] Lock 'TRIGGER_ACCESS' returned by: http-8888-Processor24
2010-07-22 13:37:53,406 (http-8888-Processor24) [ DBSemaphore.java:106:DEBUG] Lock 'TRIGGER_ACCESS' is desired by: http-8888-Processor24
2010-07-22 13:37:53,406 (http-8888-Processor24) [ DBSemaphore.java:106:DEBUG] Lock 'TRIGGER_ACCESS' is desired by: http-8888-Processor24
2010-07-22 13:37:53,406 (http-8888-Processor24) [StdRowLockSemaphore.java:89 :DEBUG] Lock 'TRIGGER_ACCESS' is being obtained: http-8888-Processor24
2010-07-22 13:37:53,406 (http-8888-Processor24) [StdRowLockSemaphore.java:89 :DEBUG] Lock 'TRIGGER_ACCESS' is being obtained: http-8888-Processor24
2010-07-22 13:37:53,406 (http-8888-Processor24) [ DBSemaphore.java:115:DEBUG] Lock 'TRIGGER_ACCESS' given to: http-8888-Processor24
2010-07-22 13:37:53,406 (http-8888-Processor24) [ DBSemaphore.java:115:DEBUG] Lock 'TRIGGER_ACCESS' given to: http-8888-Processor24
2010-07-22 13:37:53,421 (http-8888-Processor24) [ DBSemaphore.java:142:DEBUG] Lock 'TRIGGER_ACCESS' returned by: http-8888-Processor24
2010-07-22 13:37:53,421 (http-8888-Processor24) [ DBSemaphore.java:142:DEBUG] Lock 'TRIGGER_ACCESS' returned by: http-8888-Processor24
$$ unschedualResult = false
2010-07-22 13:37:53,421 (http-8888-Processor24) [ DBSemaphore.java:106:DEBUG] Lock 'TRIGGER_ACCESS' is desired by: http-8888-Processor24
2010-07-22 13:37:53,421 (http-8888-Processor24) [ DBSemaphore.java:106:DEBUG] Lock 'TRIGGER_ACCESS' is desired by: http-8888-Processor24
2010-07-22 13:37:53,421 (http-8888-Processor24) [StdRowLockSemaphore.java:89 :DEBUG] Lock 'TRIGGER_ACCESS' is being obtained: http-8888-Processor24
2010-07-22 13:37:53,421 (http-8888-Processor24) [StdRowLockSemaphore.java:89 :DEBUG] Lock 'TRIGGER_ACCESS' is being obtained: http-8888-Processor24
2010-07-22 13:37:53,421 (http-8888-Processor24) [ DBSemaphore.java:115:DEBUG] Lock 'TRIGGER_ACCESS' given to: http-8888-Processor24
2010-07-22 13:37:53,421 (http-8888-Processor24) [ DBSemaphore.java:115:DEBUG] Lock 'TRIGGER_ACCESS' given to: http-8888-Processor24
2010-07-22 13:38:07,796 (http-8888-Processor24) [ ExceptionHelper.java:97 :DEBUG] Detected JDK support for nested exceptions.
2010-07-22 13:38:07,796 (http-8888-Processor24) [ ExceptionHelper.java:97 :DEBUG] Detected JDK support for nested exceptions.
2010-07-22 13:38:07,796 (http-8888-Processor24) [ DBSemaphore.java:142:DEBUG] Lock 'TRIGGER_ACCESS' returned by: http-8888-Processor24
2010-07-22 13:38:07,796 (http-8888-Processor24) [ DBSemaphore.java:142:DEBUG] Lock 'TRIGGER_ACCESS' returned by: http-8888-Processor24
org.quartz.JobPersistenceException: Couldn't remove job: ORA-02292: 违反完整约束条件 (SYS_C0016583) - 已找到子记录
[See nested exception: java.sql.SQLException: ORA-02292: 违反完整约束条件 (SYS_C0016583) - 已找到子记录
]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.removeJob(JobStoreSupport.java:1313)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$6.execute(JobStoreSupport.java:1293)
at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:244)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.removeJob(JobStoreSupport.java:1289)
at org.quartz.core.QuartzScheduler.deleteJob(QuartzScheduler.java:835)
at org.quartz.impl.StdScheduler.deleteJob(StdScheduler.java:300)
记得源代码里有StdRowLockSemaphore,而且怪怪的,在系统的代码里面,检查quartz的代码,也有这个类,比较吧
package org.quartz.impl.jdbcjobstore;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* Internal database based lock handler for providing thread/resource locking
* in order to protect resources from being altered by multiple threads at the
* same time.
*
* @author jhouse
*/
public class StdRowLockSemaphore extends DBSemaphore {
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Constants.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
public static final String SELECT_FOR_LOCK = "SELECT * FROM "
+ TABLE_PREFIX_SUBST + TABLE_LOCKS + " WHERE " + COL_LOCK_NAME
+ " = ? FOR UPDATE";
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Constructors.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
/**
* This constructor is for using the <code>StdRowLockSemaphore</code> as
* a bean.
*/
public StdRowLockSemaphore() {
super(DEFAULT_TABLE_PREFIX, null, SELECT_FOR_LOCK);
}
public StdRowLockSemaphore(String tablePrefix, String selectWithLockSQL) {
super(tablePrefix, selectWithLockSQL, SELECT_FOR_LOCK);
}
/*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* Interface.
*
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/
/**
* Execute the SQL select for update that will lock the proper database row.
*/
protected void executeSQL(Connection conn, String lockName, String expandedSQL) throws LockException {
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn.setAutoCommit(false);
ps = conn.prepareStatement(expandedSQL);
ps.setString(1, lockName);
if (getLog().isDebugEnabled()) {
getLog().debug(
"Lock '" + lockName + "' is being obtained: " +
Thread.currentThread().getName());
}
rs = ps.executeQuery();
if (!rs.next()) {
throw new SQLException(Util.rtp(
"No row exists in table " + TABLE_PREFIX_SUBST +
TABLE_LOCKS + " for lock named: " + lockName, getTablePrefix()));
}
conn.commit();
} catch (SQLException sqle) {
//Exception src =
// (Exception)getThreadLocksObtainer().get(lockName);
//if(src != null)
// src.printStackTrace();
//else
// System.err.println("--- ***************** NO OBTAINER!");
if (getLog().isDebugEnabled()) {
getLog().debug(
"Lock '" + lockName + "' was not obtained by: " +
Thread.currentThread().getName());
}
throw new LockException("Failure obtaining db row lock: "
+ sqle.getMessage(), sqle);
} finally {
if (rs != null) {
try {
rs.close();
} catch (Exception ignore) {
}
}
if (ps != null) {
try {
ps.close();
} catch (Exception ignore) {
}
}
}
}
protected String getSelectWithLockSQL() {
return getSQL();
}
public void setSelectWithLockSQL(String selectWithLockSQL) {
setSQL(selectWithLockSQL);
}
}
发现我们的代码里面加入了这两行
conn.setAutoCommit(false);
conn.commit();
这代码是系统的创建者留下的,当时是基于什么考虑,也不可考了(代码里面没有注释)。他这么做肯定是欠妥的。
另外的问题,这么个问题延绵两年时间才搞定。。。
分享到:
相关推荐
实现把job持久化数据库,里面有具体的说明文档 Quartz 1 1 通过quartz创建持久化定时...1.3.1 实现org.quartz.Job接口 6 1.3.2 把以上job持久化到数据库中 6 1.4 启动job所需条件 6 1.4.1 在web.xml中加入如下监听 6
该压缩包内包含两个quartz的jar包, 分别是quartz-1.6.0.jar和quartz-all-1.6.0.jar
再次翻看一下我的博客,最早的那篇《 Quartz Job Scheduling Framwork 》翻译是在 2007 - 10 - 17 02:17 ,距离今日那是一个造人的时间,足见这个翻译过程有多难产。一方面是源于语言水平,再者其间也发生了许多事情...
该资源里面包含了Quartz-JOB-Framework 中文版和QUartz开发指南,而且QUartz开发指南带有书签。
Quartz 在开源任务调度框架中的翘首,它提供了强大任务调度机制,难能可贵的是它同时保持了使用的简单性。Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行关联映射。
quartz-job数据库初始化表一些表结构整理
Quartz Job Scheduling Framework.chm
Quartz Job Scheduling Framework 中文版 V1.0.0.rar。
Quartz_Job_Scheduling_Framework_中文版_V0.9.5.pdf
文件里面包括 1:Quartz开发指南.pdf 2:Quartz从入门到进阶.pdf 3:QuartzBeginnerExample一个附带的工程例子 4:quartz-1.6.1.zip Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它...
spring定时器代码。解决多次执行问题。包含quartz-all.jar包。 说明很详细。希望能帮上哪位朋友。
Quartz 是一个完全由java编写的开源作业调度框架,本文档是Quartz 的接口帮助文档,涵盖了Quartz 使用中所需要的接口。
spring3整合quartz1.8和spring3整合quartz2.2两个版本示例
quartz所需jar包,包含以下3个版本。quartz-2.2.1jar、quartz-all-1.8.5jar、quartz-all-1.6.0jar。
NULL 博文链接:https://cqh520llr.iteye.com/blog/1866359
关于spring中quartz的配置
Quartz Job Scheduling Framework 中文版 十分感谢原作者
Quartz Job Scheduling Framework 中文版 chm版
有状态Job和无状态Job 描述>=20个字符,不支持HTML标签。 详细的资源描述有机会获得我们的推荐,更有利于他人下载,赚取更多积分。
Quartz官方API文档,最新2.2.1版