第十三章. Quartz 和 Web 应用
到目前为止,我们与 Quartz 框架的交互主要还是通过命令行。对于有些使用者,比如我的一个大学计算机科学老教授(它曾每天都告诉我说,"GUI 是给能力差的人用的!"),使用命令行让他们很乐意接受。当应用程序被开发完成后,它们常要移交给终端用户或支持团队。在命令行应用程序上层架设一个 GUI 前端会非常有帮助也是很增值的。本章记述如何在 Web 应用中用 Quartz 来使得部署和维护 Job 更轻松。
一. 在 Web 应用中使用 Quartz
至此,你已经看到过许多在 J2SE 环境中独立运行的 Quartz 的例子。在第十章,"J2EE 中使用 Quartz",你也学到了 Quartz 良好的运作于 J2EE 环境中。但是,我们还没有向你介绍的是如何部署 Quartz 到一个 Java Web 应用(通常简写为 Web app)中。这就是本章唯一意图
你也许有几个理由想把 Quartz 集成到 Web 应用中。其中一些很显然的理由如下:
·使用 GUI 界面部署和运行 Job
·改善 Job 的管理和监控
·使更易于多人部署 Job
·能从你的 Web 应用内部来部署 Job
当然,在 Web 应用中使用 Quartz 主要原因还是允许通过 GUI 界面部署和维护 Job 更简单。第二个原因包括更好的管理已运行和已部署的 Job,还有当有故障时能更快得到通知。大体上,你想在其他任何软件程序之上放置一个 GUI 界面的理由也能通行于使用了 Quartz 的应用: 使更易于使用程序。
二. 集成 Quartz
幸运的是,有两方面使得很轻松集成 Quartz 到一个 Web 应用中。首先,Quartz 框架所需要的第三方库用起来相当简单。大多数所依赖的第三方库已经包含在任何 Java Web 应用中,尤其是像 Apache Struts 那样的由开源框架构建的组件。当部署 Quartz 到 Web 应用中时,Quartz 需要以下第三方库:
·Commons BeanUtil
·Commons Collections
·Commons Logging
·Commons Digester
假如你先前构建过 Java Web 应用,你应当见识过以上列出的所有组件。还有一些别的 JAR 包也可能是必须的,这要依赖于你对 Quartz 确切的部署。例如,假如 Quartz 要存储 Job 信息到数据库中,那样标准的 JDBC API 库(jdbc2_0-stdext.jar) 就是必须的,一起也可能要用到 Java 事物 API(jta.jar)。
你可能也需要一些可选的库,这依赖于你的总体需求。例如,如果你的应用需要发送 e-mail,你就需要 activation 和 JavaMail 库。但是这与你是否部署 Quartz 在一个 Web 应用还是作为一个独立的程序都是一样考虑的。
·Web 应用的结构
经历了过去的几年之后,Servlet 和 JSP 规范已得到改善,并允许更好的在不同的工具提供商之间移植。这在 Java 开发者社区中有着一种安定的效果,也让 Web 开发者把精力聚焦在 "真正的" 业务需求,而不用太关注应用的部署和运行的细节。
·安装 Quartz 库
像在任何其他的 Java Web 应用中一样,Servlet 规范指示了所有的 JAR 文件(第三方或别的) 必须放置于 WEB-INF/lib 中。因此,其中第一个步骤就是把 quartz.ar 和他所依赖的 JAR 文件放到 WEB-INF/lib 目录中。
留意 JAR 包版本和位置你必须关心的不仅是要把哪些 JAR 文件放到 Web 应用中,还要注意使用什么版本的 JAR 包和确切的放置目录。随着开发社区的不断成熟,更多的持续集成发生在各个独立的项目之间。因此某一个项目依赖于另一个项目过期版本的事情也时有发生。在升级到库的新版本前请确保检查依赖性。 另一个请记住的事情是要把库安放到哪里,这是非常重要的(有时也很令人困惑的)。所幸的是,Web 容器提供商开始遵循着相近的规范,开发人员也变得更有学识。对于 Web 应用,你几乎总是要安装一些第三方包(因你的应用需求而定) 到 WEB-INF/lib 目录中。与 XML 解析器和像 Sun Java 安全套接字扩展(JSSE) 那样的加密包的问题仍然会冒出来,但这些问题随着商业和开源提供商更新他们的发行版时会变得更少。 |
·选择一个 Web 应用框架
这完全由你来选择用哪个 Web 应用框架来与 Quartz 集成。如此多框架可选择,以致于着实无法明确的选用哪个。要说某个框架优于另一个那是很主观的,因为太多的关乎于你的需求和技术的东西。然而,有几个 Web 框架已被一段时间所证明了的。一个例子就是 Apache Struts 框架(以前是以 Jakarta Struts 著名)。因本节的用意,我们将使用 Struts 框架来演示如何与 Quartz 集成。
本文链接 https://yanbin.blog/quartz-job-scheduling-framework-13-1/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。
这个有现成的东西。。一般人不要诉他。。
在使用Quartz的持久化时,和spring配合使用,是否可以通过, 我测试的时候总是报错,说是有一个spring不能序列化??不知什么原因??我使用的是quartz的1.6版本!!
你看提示是说哪个对象不能序列化,必要时修改那个代码,或者避免去序列化那个对象,transient 修饰哪个属性试一试。
反射不能持久。。
我在阅读你的 第八章. 使用 Quartz 插件 (第二部分)
中的时候 把你的代码拷到我本机运行时发现
public void processJobs()这个方法的
JobSchedulingDataProcessor processor =new JobSchedulingDataProcessor(true, isValidateXML(), isValidateSchema());
JobSchedulingDataProcessor()不是ture
还有 private void loadJobs() throws SchedulerException
下的
this.jobFiles = dir.listFiles(new XMLFileOnlyFilter());
中 对于XMLFileOnlyFilter不是很了解
他是你自己写的xml过滤器还是其他的
如果是你自己写的 能不能麻烦你把这个类发给我下 让我研究下
JobSchedulingDataProcessor()不是ture
什么不是 true?
XMLFileOnlyFilter 的实现代码在原文中本来就是没有的,要你自己去实现。我在第八章的回复中列出了这个类的实现代码,见:http://www.blogjava.net/Unmi/archive/2008/07/20/216144.html#Post
今天碰见一个Quartz定时调用任务的奇怪问题,希望您能在白忙之中抽出时间帮我看看,非常感谢! 项目需求:每天早上9:00分读取一个.txt文件(大小2MB左右),分析数据并插入数据库,txt文件大约3万行,每天读取的.txt文件内容是不一样的,文件名以昨天的日期为名, 如:6月23日早上读取20100622.txt这个文件。每一天的文件都是存在的。 问题描述:使用Quartz进行作业调度。 tomcat启动之后的第一天执行没有问题。第二天就不执行啦。 另外我还每个三分钟执行一次做测试,因为是在同一天内,获取的是同一个文件,没有问题,一直能执行。 一用每天早上9:00来执行,就不行了, 1.quartz_job.xml文件配置如下: <job> <job-detail> <name>Job_CheckFile</name> <group>DEFAULT</group> <job-class>com.biz.CheckFileJob</job-class> </job-detail> <trigger> <cron> <name>Trigger_File</name> <group>DEFAULT</group> <job-name>Job_CheckFile</job-name> <job-group>DEFAULT</job-group> <cron-expression>0 0 9 * * ?</cron-expression> </cron> </trigger> </job> 2.CheckFileJob 类public class CheckFileJob implements Job { public CheckFileJob(){ } public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap jobDataMap = context.getMergedJobDataMap(); JobBiz.checkFile(jobDataMap); }} 3.JobBiz 类public class JobBiz { public static void checkFile(JobDataMap jobDataMap){ String fname = Common.getYesterdayFile(); //获取文件名. File file = new File("D:\\"+fname); Connection conn = ConnectionManager.getConnection(); String sql = "insert into info(place1,place2) values(?,?)"; PreparedStatement psmt = null; try { conn.setAutoCommit(false); psmt = conn.prepareStatement(sql); if(file.exists() && file.isFile()){ try { FileReader fr… Read more »
好,有时间帮你看一下。
@lapulande
我测试了下没发现什么问题,你可以进一步测试定位问题:
1. 仍旧设置为每日9点执行,你可手动更改系统时间来触发
2. 在 quartz.properties 中加上一个插件:
org.quartz.plugin.jobHistory.class=org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobHistory.jobToBeFiredMessage=Job {0} is about to be fired at: {2, date, HH:mm:ss MM/dd/yyyy}
来记录每一次执行
I can't reach your given mail address. Don't hesitate to step inside the source codes around the "error".