Quartz是一个开源的作业调度框架,它完全由java写成,并设计用于J2SE和J2EE应用中。它提供了巨大的灵活性而不牺牲简单性。你能够 用它来 为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB作业预构建,JavaMail及其它,支持cron- like表达式等等。
本文内容
1. Quartz让任务调度简单
2. Quartz的发展史
3. 上手Quartz
4. Quartz内部架构
5. 作业
6. 作业管理和存储
7. 有效作业存储
8. 作业和触发器
9. 调度一个作业
10. 用调度器(Scheduler)调用你的作业
11. 编程调度同声明性调度
12. 有状态和无状态作业
13. Quartz框架的其他特征
14. Quartz下一步计划
15. 了解更多Quartz特征
你 曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后一天执行。一个自动执行而无须干预的任务在执行过程中如果发 生一个严重错误,应用能够知到其执行失败并尝试重新执行吗?你和你的团队是用java编程吗?如果这些问题中任何一个你回答是,那么你应该使用 Quartz调度器。
旁注:Matrix目前就大量使用到了Quartz。比如,排名统计功能的实现,在Jmatrix里通过Quartz定义了一个定时调度作业,在每天凌晨一点,作业开始工作,重新统计大家的Karma和排名等。
还有,RSS文件的生成,也是通过Quartz定义作业,每隔半个小时生成一次RSS XML文件。
所以Quartz使用的地方很多,本文无疑是一篇很好的入门和进阶的文章,在此,感谢David w Johnson的努力!
Quartz让作业调度简单
Quartz 是一个完全由java编写的开源作业调度框架。不要让作业调度这个术语吓着你。尽管Quartz框架整合了许多额外功能, 但就其简易形式看,你会发现它易用得简直让人受不了!。简单地创建一个实现org.quartz.Job接口的java类。Job接口包含唯一的方法:
public void execute(JobExecutionContext context) throws JobExecutionException;
#=============================================================== # Configure Main Scheduler Properties #=============================================================== org.quartz.scheduler.instanceName = QuartzScheduler org.quartz.scheduler.instanceId = AUTO #=============================================================== # Configure ThreadPool #=============================================================== org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 5 org.quartz.threadPool.threadPriority = 5 #=============================================================== # Configure JobStore #=============================================================== org.quartz.jobStore.misfireThreshold = 60000 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
public class ScanFTPSiteJob implements Job { private static Log logger = LogFactory.getLog(ScanFTPSiteJob.class); /* * Called the scheduler framework at the right time */ public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap jobDataMap = context.getJobDataMap(); try { // Check the ftp site for files File[] files = JobUtil.checkForFiles(jobDataMap); JobUtil.sendEmail(jobDataMap, files); } catch (Exception ex) { throw new JobExecutionException(ex.getMessage()); } } }
public class MyQuartzServer { public static void main(String[] args) { MyQuartzServer server = new MyQuartzServer(); try { server.startScheduler(); } catch (SchedulerException ex) { ex.printStackTrace(); } } protected void startScheduler() throws SchedulerException { // Use the factory to create a Scheduler instance Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); // JobDetail holds the definition for Jobs JobDetail jobDetail = new JobDetail("ScanFTPJob", Scheduler.DEFAULT_GROUP, ScanFTPSiteJob.class); // Store job parameters to be used within execute() jobDetail.getJobDataMap().put( "FTP_HOST", "//home//cavaness//inbound"); // Other neccessary Job parameters here // Create a Trigger that fires every 60 seconds Trigger trigger = TriggerUtils.makeSecondlyTrigger(60); // Setup the Job and Trigger with the Scheduler scheduler.scheduleJob(jobDetail, trigger ); // Start the Scheduler running scheduler.start(); } }
ScanFTPSiteJob DEFAULT A job that scans an ftp site for files ScanFTPSiteJob FTP_HOST /home/cavaness/inbound ScanFTPSiteJobTrigger DEFAULT ScanFTPSiteJob DEFAULT 2005-09-11 6:10:00 PM -1 60000
QUATRZ --XML配置时间调度
第一步:修改XML文件,内容如下:
<servlet>
<display-name>Quartz Initializer Servlet</display-name>
<servlet-name>QuartzInitializer</servlet-name>
<servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
<init-param>
<param-name>config-file</param-name>
<param-value>/quartz.properties</param-value> /*注意,这里是配置QUARTZ的基本参数*/
</init-param>
<init-param>
<param-name>shutdown-on-unload</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
第二步:配置quartz.properties,将这个资源文件放到CLASSPATH下,内容如下:
org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = one
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 2
org.quartz.threadPool.threadPriority = 4
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTrigger
HistoryPlugin
org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {
6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}
org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} complete
d firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger in
struction code: {9}
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializatio
nPlugin
org.quartz.plugin.jobInitializer.fileName = quartz_job.xml /*这个是配置任务调度的时间*/
org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHoo
kPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true
第三步:添加quartz_job.xml,将这个文件也放到CLASSPATH下,内容如下:
<?xml version="1.0" encoding="gb2312"?>
<quartz>
<job>
<job-detail>
<name>jobTest</name>
<group>group1</group>
<job-class>com.duiduihu.ecf.common.quartz.JobEcecute</job-class> /*任务调度类*/
</job-detail>
<trigger>
<cron>
<name>trigerTest</name>
<group>group1</group>
<job-name>jobTest</job-name>
<job-group>group1</job-group>
<!--每天晚上9点执行-->
<cron-expression>0 0 21 * * ?</cron-expression> /*这个是类似于LINUX的语法的cron-expression,具体在下面详细说明*/
</cron>
</trigger>
</job>
</quartz>
第四步 创建被调度任务类 内容如下:
package test.quartz;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date;