再谈quartz

来源:互联网 发布:销售数据分析表格 编辑:程序博客网 时间:2024/05/17 01:58

quartz集成到tomcat采用是使用 ServletContextListener方案,参见http://www.blogjava.net/Unmi/archive/2008/05/01/197657.html

tomcat运行一段时间后,控制台报以下错误
2009-03-06 09:38:21 [org.quartz.core.ErrorLogger]-[ERROR] An error occured while scanning for the next trigger to fire.
org.quartz.JobPersistenceException: Couldn't rollback jdbc connection.Io 异常: Connection reset by peer: socket write error [See nestedexception: java.sql.SQLException: Io 异常: Connection reset by peer:socket write error]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.rollbackConnection(JobStoreSupport.java:2319)
at org.quartz.impl.jdbcjobstore.JobStoreTX.acquireNextTrigger(JobStoreTX.java:1222)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:233)
* Nested Exception (Underlying Cause) ---------------
java.sql.SQLException: Io 异常: Connection reset by peer: socket write error
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)
at oracle.jdbc.driver.OracleConnection.rollback(OracleConnection.java:1380)
at org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:328)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.rollback(PoolingDataSource.java:312)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.rollbackConnection(JobStoreSupport.java:2317)
at org.quartz.impl.jdbcjobstore.JobStoreTX.acquireNextTrigger(JobStoreTX.java:1222)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:233)

附开发环境:
winxp+eclipse3.2.2+jdk5.0+tomcat5.5.20+quartz1.5.2+oracle 11g


解决方案参考采用http://www.javauu.com/thread-16-1-1.html

具体描述如下:

      一直以来都相信从连接池获取过来的连接对象应该都是打开的,不可能引起的这个问题;
后面经过调试发现,在抛出异常之前Connection对象都不是null的,只是因为其状态已经被close了.
现在可以证实一点,从连接池里面获取过来的Connection并非全部是可用,如果你仔细去了解其他高级选项的配置,就会体会得到这一点.

     由于quartz默认采用连接池是dbcp,而当使用DBCP时,数据库连接因为某种原因断掉后,再从连接池中取得连接又不进行验证,这时取得的连接实际已经时无效的数据库连接了

解决方法:
    方法一:设置weblogic上面的连接池参数,打开要配置的连接池的配置页面,点击Connection选项卡,在下面找到一个show,点击,就会显示连接池的高级配置选项,
勾选"Test ReserverConnetion",勾选这个的意思,就是要让weblogic在向客户端提供Connection之前,都先自己测试一下这个Connection是否可用,防止weblogic向客户端发送已经关闭的Connection对象,导致应用程序抛出异常.
    方法二:当然还有另一种方法就是在程序这边作相应的判断,每从数据连接池中获取一个Connection对象时,都要先判断其他状态是否是Open的,如果不是Open的,就重新到池里面再获取一个新的连接,直到获取的连接是可用的为止。

while(conn.isClosed()){
       conn=getConnectionFromPool();
}

在配置连接池时,建议大家多了解其他里面的各个参数项,

 

 

补记:解决ObjectAlreadyExistsException异常导致调度器失效

2009-03-25 16:12:05 [vs.dascsl.dbaccess.datatransfer.ScheduleStartListener]-[ERROR] Quartz failed to initialize
org.quartz.ObjectAlreadyExistsException: Unable to store Job with name: 'b8d44040-f803-443c-8ce8-4b10738a579e' and group: 'DEFAULT', because one already exists with this identification.
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJob(JobStoreSupport.java:1098)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$3.execute(JobStoreSupport.java:1047)
    at org.quartz.impl.jdbcjobstore.JobStoreSupport$40.execute(JobStoreSupport.java:3688)

 

//在ScheduleStartListener加载所有定时器

for ( ....){

 

.....//代码略


通过try{


...
//代码略


} catch    (ObjectAlreadyExistsException e){//已经解决


continue;//捕获ObjectAlreadyExistsException后直接加载下一个定时器,否则调度器失效


}


.....//代码略

}

原创粉丝点击