(所有程序代码及官方包可以在论坛里下载) Quartz是一个完整的,开源的作业调度系统,它可以被整合,也可以连同J2EE,J2SE应用程序共同应用,从最小的应用程序到大型的商业系统都可以使用。Quartz可以被用来创建简单或复杂的的作业,用来执行数十个,数百个甚至数万的调度;这些作业调度被定义为标准的JAVA组件如EJB等。Quartz调度器包含很多企业级的应用,例如JTA事务和集群。
到底什么是作业调度,很多人依然不明白这个概念,简单介绍一下:
你需要你的软件实现这样一个功能,固定的某个时间,比如每天早晨8点执行一个任务,或者每周一早晨执行一个任务,对我们程序员来说就是执行一段代码。这个功能实现起来其实很简单,Timer,TimerTask就可以实现,但是不是很灵活,很多需求需要自己实现。
我们移动公司每个月月底要进行结算,这个结算?{1}*{2}工要累死人的,可以交给Quartz;一个成熟的大型软件系统总离不开数据统计,如图书管理,希望每天可以自动清算过期未还的书籍数据;一个财务软件希望定时生成各种报表.......这些都可以交给强大的Quartz来实现!
多说无益,我一直有个观点,理论再多不如一个好理解的好例子,大家一起来通过Quartz的官方例子来学习下,当然,我做过汉化处理了,不用担心E文了,这个世界好人多啊,没办法!
首先下载官方包,附件里有,不用去官方网站找了!
懒人较多,后面附件里有基于Eclipse的代码,如果你连代码都懒的写,那就直接下载导入项目就可以运行了(注意jar包),怎么导入你都不会?你先补基础吧!
第一个示例!
1.新建项目QuartzL001,在src下新建log4j.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="default" class="org.apache.log4j.ConsoleAppender">
<param name="target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss.SSS aa} %t [%c]%n%m%n%n"/>
</layout>
</appender>
<logger name="org.quartz">
<level value="debug" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="default" />
</root>
</log4j:configuration>
2.导入如下包,用MyEclipse导入javaee.jar,JDK所有包,quartz-1.6.0.jar,commons-logging.jar,log4j.jar,commons-collections.jar。
3.新建HelloJob类
package com.zbaccp;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* <p>
* 这是个简单的作业,只是用来说Hello的入门程序
* </p>
*
* @author 张帅
*/
public class HelloJob implements Job {
private static Log _log = LogFactory.getLog(HelloJob.class);
public HelloJob() {
}
public void execute(JobExecutionContext context)
throws JobExecutionException {
// 输出Hello World! -和具体时间
_log.info("Hello World! - " + new Date());
}
}
新建SimpleExample类
package com.zbaccp;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
/**
* 这个例子用来展示怎么样启动和停止Quartz调度器,如何在Quartz里调度一个作业
*
*
* @author 张帅
*/
public class SimpleExample {
public void run() throws Exception {
Log log = LogFactory.getLog(SimpleExample.class);
log.info("------- 初始化 ----------------------");
// 首先必须得到一个调度器Scheduler
SchedulerFactory sf = new StdSchedulerFactory();//不用我说了,工厂模式
Scheduler sched = sf.getScheduler();
log.info("------- 初始化结束 -----------");
log.info("------- 调度开始 -------------------");
// 得到当前时间的下一分钟,比如当前时间14:30:14,下一分钟即14:31:00
Date runTime = TriggerUtils.getEvenMinuteDate(new Date());
// 定义一个作业让他和HelloJob产生关联
JobDetail job = new JobDetail("job1", "group1", HelloJob.class);
// 在下一分钟触发这个作业
SimpleTrigger trigger =
new SimpleTrigger("trigger1", "group1", runTime);
// 告诉Quartz用我们的触发器来调度这个作业
sched.scheduleJob(job, trigger);
log.info(job.getFullName() + " 将在" + runTime+" 执行");
// 开启调度器,并不是真的启动作业(到我们指定时间才会启动)
sched.start();
log.info("------- 调度器启动 -----------------");
// 等足够长的时间让调度器有机会来执行作业
log.info("------- 等待 90 秒... -------------");
try {
// 等待90秒来查看jobs执行
Thread.sleep(90L * 1000L);
// 执行中
} catch (Exception e) {
}
// 关闭调度器
log.info("------- 关闭 ---------------------");
sched.shutdown(true);
log.info("------- 结束关闭 -----------------");
}
public static void main(String[] args) throws Exception {
SimpleExample example = new SimpleExample();
example.run();
}
}
4.没意外的话直接运行SimpleExample,看结果。