Quartz Job Scheduling Framework[翻译]第十三章. Quartz 和 Web 应用 (第四部分)

五. 使用 ServletContextListener

很值得一提的是你可以配置和集成 Quartz 到 Web 应用的另一种方式。从 2.3 版本的 Servlet API 开始,你能创建监听器,由容器在其生命周期中的某个特定时间回调。其中的一个监听器接口叫做 java.servlet.ServletContextListener,它包括有两个方法:

public void contextInitialized(ServletContextEvent sce);
public void contextDestroyed(ServeltContextEvent sce);

容器会在启动和关闭的时候相应的调用这两个方法。这就可以在 contextInitialized() 方法中初始化 Quartz Scheduler,并通过 contextDestroyed() 方法关闭它。代码 13.5 描述了这种用法:

代码 13.5. ServletContextListener 也能被用于初始化 Quartz

正如我们在 QuartzInitializerServlet 中所做的,我们需要为这个监听器加入一些配置信息到 Web 部署描术文件(web.xml) 中。针对我们的监听器,我们需要加一个 <listener> 元素到部署描述中。如下片断中显示:

·新的 QuartzInitializerListener 已加入到 Quartz 中

ServletContextListener 为顺应用户社区而来的呼声被加入到 Quartz 框架中。13.5 中的代码应当认为是一个例子,实际应用时你需要开发你自己的监听器。

本文链接 https://yanbin.blog/quartz-job-scheduling-framework-13-4/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

9 Comments
Inline Feedbacks
View all comments
日月雨林@gmail.com
15 years ago

今天我又拜读了你的翻译大作!呵呵!

俞鹏
15 years ago

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 nested exception: 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)2009-03-06 09:38:46 [org.quartz.impl.jdbcjobstore.JobStoreTX]-[ERROR] MisfireHandler: Error handling misfires: Couldn't rollback jdbc connection. Io 异常: Connection reset by peer: socket write errororg.quartz.JobPersistenceException: Couldn't rollback jdbc… Read more »

俞鹏
15 years ago

基本采用就该博文思路制作,根据
at org.quartz.impl.jdbcjobstore.JobStoreSupport.rollbackConnection(JobStoreSupport.java:2319)
查quartz源码,发现connection并不为空,但不知为何不能回滚,以及如何解决该问题,望赐教

隔叶黄莺
15 years ago

必要时用 netstat -na 观察一下连接,异常看起来像连接被断开了。

俞鹏
15 years ago

//JobStoreSupport.java源码段
2315 if (conn != null) {
2316 try {
2317 conn.rollback();
2318 } catch (SQLException e) {
2319 throw new JobPersistenceException(
2320 "Couldn't rollback jdbc connection. "+e.getMessage(), e);
2321 }
2322 }
2324 }

以上信息发现conn并不为空,但不知为何不能回滚,以及如何解决该问题,望赐教

再附:数据库采用是oracle 11g

隔叶黄莺
15 years ago

物理连接断了, conn 也不会为 null 的,用 conn.isClosed() 判断一下看看,必要时观察一下那个特定的连接是不是还通着的。

俞鹏
15 years ago

我故意拔掉客户端网线,重新打开IE,其他页面正常,唯独停止点击执行如下代码
currScheduler.pauseTrigger(trigVO.getTriggerID(),currScheduler.DEFAULT_GROUP);

就会出错,出错信息同上
注:currScheduler不为空,参数也正确

望再赐教,3q

俞鹏
15 years ago

按理说,quartz是tomcat服务器自动运行的东东,不受客户端影响才对呀

隔叶黄莺
15 years ago

那你要检查为什么连接会被断掉